diff --git a/Sources/AOC2018/day12.swift b/Sources/AOC2018/day12.swift new file mode 100644 index 0000000..3bdcbfa --- /dev/null +++ b/Sources/AOC2018/day12.swift @@ -0,0 +1,175 @@ +// +// Advent of Code 2018 "Day 12: Subterranean Sustainability" +// + +import Foundation + +class Sustainability { + var condition = "" + var pattern: [String: String] = [:] + var keyLength = 0 + var paddingLength = 0 + + // Supply test data in the form of a String + init(withString noteList: String, andInitialCondition initial: String, padding pad: Int) { + paddingLength = pad + let padding = String(Array(repeating: ".", count: paddingLength)) + condition = padding + initial + padding + let noteStrings = noteList.components(separatedBy: "\n") + parseData(withNotes: noteStrings) + } + + func parseData(withNotes noteArray: [String]) { + for oneNote in noteArray { + var line = oneNote + line = line.replacingOccurrences(of: " => ", with: " ") + let data = line.components(separatedBy: " ") + guard data.count == 2 else { print("Error"); return } + pattern[data[0]] = data[1] + keyLength = data[0].count + } + } + + func nextGeneration(with previous: String) -> String { + var nextGen = String(Array(repeating: ".", count: keyLength/2)) + for i in 0.. Int { + var value = 0 + let start = -paddingLength + for i in 0.. ()) = day12Tests + lazy var final: (() -> ()) = day12Final + + func testSustainabilityInit() { + let _ = Sustainability(withString: testNotes, andInitialCondition: testInitialState, padding: 15) + } + + func testNextGeneration() { + let sus = Sustainability(withString: testNotes, andInitialCondition: testInitialState, padding: 15) + var gen = sus.condition + print(" 0", terminator: ": ") + print("\(gen)") + for i in 1...20 { + print(NSString(format:"%2d", i), terminator: ": ") + gen = sus.nextGeneration(with: gen) + print("\(gen)") + } + } + + func testGetVaue() { + let sus = Sustainability(withString: testNotes, andInitialCondition: testInitialState, padding: 15) + var gen = sus.condition + for _ in 1...20 { + gen = sus.nextGeneration(with: gen) + } + let value = sus.getValue(of: gen) + XCTAssertEqual(test: "testGetVaue", withExpression: (value == 325)) + } + + func day12Tests() { + testSustainabilityInit() + testNextGeneration() + testGetVaue() + } + + func day12Final() { + let sus = Sustainability(withString: finalNotes, andInitialCondition: finalInitialState, padding: 200) + var gen = sus.condition + for _ in 1...20 { + gen = sus.nextGeneration(with: gen) + } + let value = sus.getValue(of: gen) + print("Answer to part 1 is: \(value)") + + + let limitCount = 150 + var inc = 0 //40 + gen = sus.condition + for _ in 1...limitCount { + let preValue = sus.getValue(of: gen) + gen = sus.nextGeneration(with: gen) + let postValue = sus.getValue(of: gen) + inc = postValue - preValue + } + let valLimit = sus.getValue(of: gen) + let generations = 50000000000 - limitCount + let answer = generations * inc + valLimit + print("Answer to part 2 is: \(answer)") + } +} + +var testInitialState = "#..#.#..##......###...###" +var testNotes = """ + ...## => # + ..#.. => # + .#... => # + .#.#. => # + .#.## => # + .##.. => # + .#### => # + #.#.# => # + #.### => # + ##.#. => # + ##.## => # + ###.. => # + ###.# => # + ####. => # + """ + +var finalInitialState = "##.......#.######.##..#...#.#.#..#...#..####..#.##...#....#...##..#..#.##.##.###.##.#.......###....#" +var finalNotes = """ + .#### => . + ....# => . + ###.. => . + ..#.# => . + ##### => # + ####. => . + #.##. => # + #.#.# => . + ##.#. => # + .###. => . + #..#. => # + ###.# => . + #.### => . + ##... => # + .#.## => . + ..#.. => . + #...# => # + ..... => . + .##.. => . + ...#. => . + #.#.. => . + .#..# => # + .#.#. => . + .#... => # + ..##. => . + #..## => . + ##.## => # + ...## => # + ..### => # + #.... => . + .##.# => # + ##..# => # + """ diff --git a/Sources/AOC2018/main.swift b/Sources/AOC2018/main.swift index c41e52e..c1adc7e 100644 --- a/Sources/AOC2018/main.swift +++ b/Sources/AOC2018/main.swift @@ -5,7 +5,7 @@ import Foundation let showTests = true -let onlyOneDay = 11 +let onlyOneDay = 0 var allTests: [(() -> ())] = [] var allFinal: [(() -> ())] = [] @@ -23,6 +23,7 @@ allTests.append(Day08().tests) allTests.append(Day09().tests) allTests.append(Day10().tests) allTests.append(Day11().tests) +allTests.append(Day12().tests) // Compile list of Answers allFinal.append(Day01().final) @@ -36,6 +37,7 @@ allFinal.append(Day08().final) allFinal.append(Day09().final) allFinal.append(Day10().final) allFinal.append(Day11().final) +allFinal.append(Day12().final) if onlyOneDay > 0 { print("\nDay \(onlyOneDay)")