Added Code for Day 11
Day 11: Chronal Charge (done, but I don't like my solution)
This commit is contained in:
@@ -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
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
let showTests = true
|
let showTests = true
|
||||||
let onlyOneDay = 10
|
let onlyOneDay = 11
|
||||||
var allTests: [(() -> ())] = []
|
var allTests: [(() -> ())] = []
|
||||||
var allFinal: [(() -> ())] = []
|
var allFinal: [(() -> ())] = []
|
||||||
|
|
||||||
@@ -22,6 +22,7 @@ allTests.append(Day07().tests)
|
|||||||
allTests.append(Day08().tests)
|
allTests.append(Day08().tests)
|
||||||
allTests.append(Day09().tests)
|
allTests.append(Day09().tests)
|
||||||
allTests.append(Day10().tests)
|
allTests.append(Day10().tests)
|
||||||
|
allTests.append(Day11().tests)
|
||||||
|
|
||||||
// Compile list of Answers
|
// Compile list of Answers
|
||||||
allFinal.append(Day01().final)
|
allFinal.append(Day01().final)
|
||||||
@@ -34,6 +35,7 @@ allFinal.append(Day07().final)
|
|||||||
allFinal.append(Day08().final)
|
allFinal.append(Day08().final)
|
||||||
allFinal.append(Day09().final)
|
allFinal.append(Day09().final)
|
||||||
allFinal.append(Day10().final)
|
allFinal.append(Day10().final)
|
||||||
|
allFinal.append(Day11().final)
|
||||||
|
|
||||||
if onlyOneDay > 0 {
|
if onlyOneDay > 0 {
|
||||||
print("\nDay \(onlyOneDay)")
|
print("\nDay \(onlyOneDay)")
|
||||||
|
|||||||
Reference in New Issue
Block a user