Add Code for Day 12
Day 12: Subterranean Sustainability - ended up looking for a repeating pattern - then figured out how many generation to repeat - calculated out 50000000000 generations
This commit is contained in:
@@ -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..<previous.count-keyLength {
|
||||||
|
let start = previous.index(previous.startIndex, offsetBy: i)
|
||||||
|
let end = previous.index(previous.startIndex, offsetBy: i + keyLength)
|
||||||
|
let range = start..<end
|
||||||
|
let substr = String(previous[range])
|
||||||
|
if pattern[substr] == nil {
|
||||||
|
nextGen += "."
|
||||||
|
} else {
|
||||||
|
nextGen = nextGen + pattern[substr]!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nextGen += String(Array(repeating: ".", count: keyLength/2+1))
|
||||||
|
return nextGen
|
||||||
|
}
|
||||||
|
|
||||||
|
func getValue(of plants: String) -> Int {
|
||||||
|
var value = 0
|
||||||
|
let start = -paddingLength
|
||||||
|
for i in 0..<plants.count {
|
||||||
|
let pot = start + i
|
||||||
|
value += plants[i] == "#" ? pot : 0
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Day12: AOCDay {
|
||||||
|
lazy var tests: (() -> ()) = 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 = """
|
||||||
|
.#### => .
|
||||||
|
....# => .
|
||||||
|
###.. => .
|
||||||
|
..#.# => .
|
||||||
|
##### => #
|
||||||
|
####. => .
|
||||||
|
#.##. => #
|
||||||
|
#.#.# => .
|
||||||
|
##.#. => #
|
||||||
|
.###. => .
|
||||||
|
#..#. => #
|
||||||
|
###.# => .
|
||||||
|
#.### => .
|
||||||
|
##... => #
|
||||||
|
.#.## => .
|
||||||
|
..#.. => .
|
||||||
|
#...# => #
|
||||||
|
..... => .
|
||||||
|
.##.. => .
|
||||||
|
...#. => .
|
||||||
|
#.#.. => .
|
||||||
|
.#..# => #
|
||||||
|
.#.#. => .
|
||||||
|
.#... => #
|
||||||
|
..##. => .
|
||||||
|
#..## => .
|
||||||
|
##.## => #
|
||||||
|
...## => #
|
||||||
|
..### => #
|
||||||
|
#.... => .
|
||||||
|
.##.# => #
|
||||||
|
##..# => #
|
||||||
|
"""
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
let showTests = true
|
let showTests = true
|
||||||
let onlyOneDay = 11
|
let onlyOneDay = 0
|
||||||
var allTests: [(() -> ())] = []
|
var allTests: [(() -> ())] = []
|
||||||
var allFinal: [(() -> ())] = []
|
var allFinal: [(() -> ())] = []
|
||||||
|
|
||||||
@@ -23,6 +23,7 @@ allTests.append(Day08().tests)
|
|||||||
allTests.append(Day09().tests)
|
allTests.append(Day09().tests)
|
||||||
allTests.append(Day10().tests)
|
allTests.append(Day10().tests)
|
||||||
allTests.append(Day11().tests)
|
allTests.append(Day11().tests)
|
||||||
|
allTests.append(Day12().tests)
|
||||||
|
|
||||||
// Compile list of Answers
|
// Compile list of Answers
|
||||||
allFinal.append(Day01().final)
|
allFinal.append(Day01().final)
|
||||||
@@ -36,6 +37,7 @@ allFinal.append(Day08().final)
|
|||||||
allFinal.append(Day09().final)
|
allFinal.append(Day09().final)
|
||||||
allFinal.append(Day10().final)
|
allFinal.append(Day10().final)
|
||||||
allFinal.append(Day11().final)
|
allFinal.append(Day11().final)
|
||||||
|
allFinal.append(Day12().final)
|
||||||
|
|
||||||
if onlyOneDay > 0 {
|
if onlyOneDay > 0 {
|
||||||
print("\nDay \(onlyOneDay)")
|
print("\nDay \(onlyOneDay)")
|
||||||
|
|||||||
Reference in New Issue
Block a user