From ae1b714614f80dae09aa5d2f168412fadf2d89fc Mon Sep 17 00:00:00 2001 From: Max Nuding Date: Tue, 14 Dec 2021 17:24:15 +0100 Subject: [PATCH] 14a (bad version) --- Package.swift | 7 +- Sources/14/14.swift | 74 +++++++++++++++ Sources/14/main.swift | 12 +++ Sources/Runner/Resources/input/14.txt | 102 +++++++++++++++++++++ Sources/Runner/Resources/input/14_test.txt | 18 ++++ 5 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 Sources/14/14.swift create mode 100644 Sources/14/main.swift create mode 100644 Sources/Runner/Resources/input/14.txt create mode 100644 Sources/Runner/Resources/input/14_test.txt diff --git a/Package.swift b/Package.swift index 1e1f1a9..0c76ea8 100644 --- a/Package.swift +++ b/Package.swift @@ -22,7 +22,8 @@ let package = Package( .executable(name: "10", targets: ["10"]), .executable(name: "11", targets: ["11"]), .executable(name: "12", targets: ["12"]), - .executable(name: "13", targets: ["13"]) + .executable(name: "13", targets: ["13"]), + .executable(name: "14", targets: ["14"]) ], dependencies: [ // Dependencies declare other packages that this package depends on. @@ -106,6 +107,10 @@ let package = Package( .executableTarget( name: "13", dependencies: [ .targetItem(name: "Runner", condition: nil) ] + ), + .executableTarget( + name: "14", + dependencies: [ .targetItem(name: "Runner", condition: nil) ] ) ] ) diff --git a/Sources/14/14.swift b/Sources/14/14.swift new file mode 100644 index 0000000..ed236be --- /dev/null +++ b/Sources/14/14.swift @@ -0,0 +1,74 @@ +// +// File.swift +// +// +// Created by Max Nuding on 14.12.21. +// + +import Foundation +import Runner + +struct Replacement { + let from: String + let to: String + + init(line: String) { + let r = line.components(separatedBy: " -> ") + from = r.first! + to = r.last! + } + + func replace(pair: String) -> String.Element? { pair == from ? to.first : nil } +} + +class Day14: Runnable { + let inputPath: String + + required init(inputPath: String) { + self.inputPath = inputPath + } + + public func run() { + let input = try! String(contentsOfFile: inputPath) + let parts = input + .trimmingCharacters(in: .newlines) + .components(separatedBy: "\n\n") + var startingPolymer = parts.first! + let replacements = parts.last! + .components(separatedBy: .newlines) + .map(Replacement.init) + + for step in 1...10 { + var inserts = [(String.Index, Character)]() + for i in startingPolymer.indices { + let next = startingPolymer.index(i, offsetBy: 1) + guard next != startingPolymer.endIndex else { + continue + } + var pair = startingPolymer[i]/* + startingPolymer[next]*/ + let p = "\(startingPolymer[i])\(startingPolymer[next])" + for replacement in replacements { + if let c = replacement.replace(pair: p) { + inserts.append((next, c)) + break + } + } + } + + var tmp = startingPolymer + var count = 0 + for r in inserts { + let idx = tmp.index(r.0, offsetBy: count) + tmp.insert(r.1, at: idx) + count += 1 + } + startingPolymer = tmp + } + let charCounts = startingPolymer.reduce(into: [String.Element: Int](), { + $0[$1, default: 0] += 1 + }) + let maxC = charCounts.max(by: {$0.value < $1.value })! + let minC = charCounts.min(by: {$0.value < $1.value })! + print(maxC.value - minC.value) + } +} diff --git a/Sources/14/main.swift b/Sources/14/main.swift new file mode 100644 index 0000000..6705209 --- /dev/null +++ b/Sources/14/main.swift @@ -0,0 +1,12 @@ +// +// File.swift +// +// +// Created by Max Nuding on 14.12.21. +// + +import Foundation +import Runner + +//Runner(target: Day14.self, day: "14", isTest: true).run() +Runner(target: Day14.self, day: "14", isTest: false).run() diff --git a/Sources/Runner/Resources/input/14.txt b/Sources/Runner/Resources/input/14.txt new file mode 100644 index 0000000..b0bcae6 --- /dev/null +++ b/Sources/Runner/Resources/input/14.txt @@ -0,0 +1,102 @@ +FNFPPNKPPHSOKFFHOFOC + +VS -> B +SV -> C +PP -> N +NS -> N +BC -> N +PB -> F +BK -> P +NV -> V +KF -> C +KS -> C +PV -> N +NF -> S +PK -> F +SC -> F +KN -> K +PN -> K +OH -> F +PS -> P +FN -> O +OP -> B +FO -> C +HS -> F +VO -> C +OS -> B +PF -> V +SB -> V +KO -> O +SK -> N +KB -> F +KH -> C +CC -> B +CS -> C +OF -> C +FS -> B +FP -> H +VN -> O +NB -> N +BS -> H +PC -> H +OO -> F +BF -> O +HC -> P +BH -> S +NP -> P +FB -> C +CB -> H +BO -> C +NN -> V +SF -> N +FC -> F +KK -> C +CN -> N +BV -> F +FK -> C +CF -> F +VV -> B +VF -> S +CK -> C +OV -> P +NC -> N +SS -> F +NK -> V +HN -> O +ON -> P +FH -> O +OB -> H +SH -> H +NH -> V +FF -> B +HP -> B +PO -> P +HB -> H +CH -> N +SN -> P +HK -> P +FV -> H +SO -> O +VH -> V +BP -> V +CV -> P +KP -> K +VB -> N +HV -> K +SP -> N +HO -> P +CP -> H +VC -> N +CO -> S +BN -> H +NO -> B +HF -> O +VP -> K +KV -> H +KC -> F +HH -> C +BB -> K +VK -> P +OK -> C +OC -> C +PH -> H diff --git a/Sources/Runner/Resources/input/14_test.txt b/Sources/Runner/Resources/input/14_test.txt new file mode 100644 index 0000000..b5594dd --- /dev/null +++ b/Sources/Runner/Resources/input/14_test.txt @@ -0,0 +1,18 @@ +NNCB + +CH -> B +HH -> N +CB -> H +NH -> C +HB -> C +HC -> B +HN -> C +NN -> C +BH -> H +NC -> B +NB -> B +BN -> B +BB -> N +BC -> B +CC -> N +CN -> C