From 439760c9ec79553cd9fe254c887bfd4334b52556 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 13 Dec 2018 11:24:28 -0600 Subject: [PATCH] Added Code for Day 11 Day 11: Chronal Charge (done, but I don't like my solution) --- Sources/AOC2018/day11.swift | 142 ++++++++++++++++++++++++++++++++++++ Sources/AOC2018/main.swift | 4 +- 2 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 Sources/AOC2018/day11.swift diff --git a/Sources/AOC2018/day11.swift b/Sources/AOC2018/day11.swift new file mode 100644 index 0000000..625cca1 --- /dev/null +++ b/Sources/AOC2018/day11.swift @@ -0,0 +1,142 @@ +// +// Advent of Code 2018 "Day 11: Chronal Charge" +// + +import Foundation + +class Charge { + var grid: [Int] = [] + + init(withSerialNumber num: Int) { + grid = Array(repeating: 0, count: 300 * 300) + for j in 0..<300 { + for i in 0..<300 { + // grid[j * 300 + i] = + let ID = i + 11 + let power = (ID * (j + 1) + num) * ID + // print("power[\(i+1),\(j+1)] : \(power), \(power/1000)") + if power < 100 { + print("_____________________> WOW <__________________") + } + grid[j*300+i] = (power - (power/1000) * 1000 - (power % 100))/100 - 5 + // print("\(power % 100), mynum = \(mynum)") + // if (i == 2) { break } + } + // if j == 4 { break } + } + } + + func getVal(for pt: (Int, Int)) -> Int { + return grid[(pt.1 - 1) * 300 + (pt.0 - 1)] + } + + func sum(for pt: (Int, Int, Int)) -> Int { + let x = pt.0 - 1 + let y = pt.1 - 1 + let size = pt.2 - 1 + var sum = 0 + for j in y...y+size { + for i in x...x+size { + sum += grid[j*300+i] + // print("\(grid[j*300+i])", terminator: " ") + } + // print("") + } + // for j in pt.1-2...pt.1+2 { + // for i in pt.0-2...pt.0+2 { + // // print("\(grid[j*300+i])", terminator: " ") + // print(NSString(format:"%4d", grid[j*300+i]), terminator: "") + // } + // print("") + // } + // print("sum:\(sum)") + return sum + } + +} + +class Day11: AOCDay { + lazy var tests: (() -> ()) = day11Tests + lazy var final: (() -> ()) = day11Final + + func testInitCharge() { + let _ = Charge(withSerialNumber: 5093) + // let cha = Charge(withSerialNumber: 8) + } + + func testPoint() { + var cha = Charge(withSerialNumber: 57) + var val = cha.getVal(for: (122, 79)) + XCTAssertEqual(test: "testPoint (122,79)", withExpression: (val == -5)) + cha = Charge(withSerialNumber: 39) + val = cha.getVal(for: (217, 196)) + XCTAssertEqual(test: "testPoint (217,196)", withExpression: (val == 0)) + cha = Charge(withSerialNumber: 71) + val = cha.getVal(for: (101, 153)) + XCTAssertEqual(test: "testPoint (101,153)", withExpression: (val == 4)) + } + + func testSum() { + var cha = Charge(withSerialNumber: 18) + var sum = cha.sum(for: (33, 45, 3)) + XCTAssertEqual(test: "testSum (33,45)", withExpression: (sum == 29)) + cha = Charge(withSerialNumber: 42) + sum = cha.sum(for: (21, 61, 3)) + XCTAssertEqual(test: "testSum (21,61)", withExpression: (sum == 30)) + } + + func day11Tests() { + testInitCharge() + testPoint() + testSum() + } + + func day11Final() { + // let retVal = "None" + let cha = Charge(withSerialNumber: 5093) + var maxSum = 0 + var maxCoord = (0,0) + for y in 1...298 { + for x in 1...298 { + let sum = cha.sum(for: (x, y, 3)) + if sum > maxSum { + maxSum = sum + maxCoord = (x, y) + } + } + } + + print("Answer to part 1 is: \(maxCoord)") + + var maxSize = 0 + var outerMaxSum = 0 + var outerMaxCoord = (0,0) + for size in 1...300 { + maxSum = 0 + maxCoord = (0,0) + for y in 1...300 - size + 1 { + for x in 1...300 - size + 1 { + let sum = cha.sum(for: (x, y, size)) + if sum > maxSum { + maxSum = sum + maxCoord = (x, y) + } + } + } + if maxSum > outerMaxSum { + outerMaxSum = maxSum + outerMaxCoord = maxCoord + maxSize = size + } + print("\(outerMaxCoord), \(maxSize)") + } + print("Answer to part 2 is: \(outerMaxCoord), \(maxSize)") + } +} + +// RackID = X + 10 +// Power = RackID * Y +// Power += SerialNumber +// Power *= Power * RackID +// Power = "hundreds digit" +// Power -= 5 diff --git a/Sources/AOC2018/main.swift b/Sources/AOC2018/main.swift index 7f87d0a..c41e52e 100644 --- a/Sources/AOC2018/main.swift +++ b/Sources/AOC2018/main.swift @@ -5,7 +5,7 @@ import Foundation let showTests = true -let onlyOneDay = 10 +let onlyOneDay = 11 var allTests: [(() -> ())] = [] var allFinal: [(() -> ())] = [] @@ -22,6 +22,7 @@ allTests.append(Day07().tests) allTests.append(Day08().tests) allTests.append(Day09().tests) allTests.append(Day10().tests) +allTests.append(Day11().tests) // Compile list of Answers allFinal.append(Day01().final) @@ -34,6 +35,7 @@ allFinal.append(Day07().final) allFinal.append(Day08().final) allFinal.append(Day09().final) allFinal.append(Day10().final) +allFinal.append(Day11().final) if onlyOneDay > 0 { print("\nDay \(onlyOneDay)")