From eff95027de68af6283219a6a06251d7629fe0f03 Mon Sep 17 00:00:00 2001 From: Hubert Van De Walle Date: Tue, 14 Dec 2021 22:46:54 +0100 Subject: [PATCH] Day14 2021 --- 2021/src/main/kotlin/Day14.kt | 36 +++++++++++ 2021/src/main/resources/day14.txt | 102 ++++++++++++++++++++++++++++++ 2021/src/test/kotlin/Day14Test.kt | 30 +++++++++ 3 files changed, 168 insertions(+) create mode 100644 2021/src/main/kotlin/Day14.kt create mode 100644 2021/src/main/resources/day14.txt create mode 100644 2021/src/test/kotlin/Day14Test.kt diff --git a/2021/src/main/kotlin/Day14.kt b/2021/src/main/kotlin/Day14.kt new file mode 100644 index 0000000..e877104 --- /dev/null +++ b/2021/src/main/kotlin/Day14.kt @@ -0,0 +1,36 @@ +package be.vandewalleh.aoc.days + +import be.vandewalleh.aoc.utils.BaseDay +import be.vandewalleh.aoc.utils.input.Day + +@Day +class Day14 : BaseDay() { + + private fun run(step: Int): Long { + val template = input.lines.value.first() + // {CH=(CB, BH), NN=(NC, CN), ...} + val pairs = input.lines.value.drop(2) + .associate { it.split(" -> ").let { (a, b) -> a to (a[0] + b to b + a[1]) } } + + fun Map.toLong() = mapValues { it.value.toLong() }.toMutableMap() + + // {NN=1, NC=1, CB=1} + val polymer = template.windowed(2).groupingBy { it }.eachCount().toLong() + + // {N=2, C=1, ...} + val counts = template.groupingBy { it }.eachCount().toLong() + repeat(step) { + polymer.toMap().forEach { (pair, value) -> + val (left, right) = pairs[pair]!! + polymer[pair]?.let { old -> polymer[pair] = old - value } + polymer[left] = (polymer[left] ?: 0) + value + polymer[right] = (polymer[right] ?: 0) + value + counts[left[1]] = (counts[left[1]] ?: 0) + value + } + } + return counts.maxOf { it.value } - counts.minOf { it.value } + } + + override fun part1() = run(10) + override fun part2() = run(40) +} diff --git a/2021/src/main/resources/day14.txt b/2021/src/main/resources/day14.txt new file mode 100644 index 0000000..c357f08 --- /dev/null +++ b/2021/src/main/resources/day14.txt @@ -0,0 +1,102 @@ +PHVCVBFHCVPFKBNHKNBO + +HK -> F +VN -> S +NB -> F +HF -> B +CK -> N +VP -> B +HO -> P +NH -> N +CC -> N +FC -> P +OK -> S +OO -> P +ON -> C +VF -> B +NN -> O +KS -> P +FK -> K +HB -> V +SH -> O +OB -> K +PB -> V +BO -> O +NV -> K +CV -> H +PH -> H +KO -> B +BC -> B +KC -> B +SO -> P +CF -> V +VS -> F +OV -> N +NS -> K +KV -> O +OP -> O +HH -> C +FB -> S +CO -> K +SB -> K +SN -> V +OF -> F +BN -> F +CP -> C +NC -> H +VH -> S +HV -> V +NF -> B +SS -> K +FO -> F +VO -> H +KK -> C +PF -> V +OS -> F +OC -> H +SK -> V +FF -> H +PK -> N +PC -> O +SP -> B +CB -> B +CH -> H +FN -> V +SV -> O +SC -> P +NP -> B +BB -> S +PV -> S +VB -> P +SF -> H +VC -> O +HN -> V +BF -> O +NO -> O +HP -> N +VV -> K +HS -> P +FH -> N +KB -> F +KF -> B +PN -> K +KH -> K +CN -> S +PP -> O +BP -> O +OH -> B +FS -> O +BK -> B +PO -> V +CS -> C +BV -> N +KP -> O +KN -> B +VK -> F +HC -> O +BH -> B +FP -> H +NK -> V +BS -> C +FV -> F +PS -> P diff --git a/2021/src/test/kotlin/Day14Test.kt b/2021/src/test/kotlin/Day14Test.kt new file mode 100644 index 0000000..b59e574 --- /dev/null +++ b/2021/src/test/kotlin/Day14Test.kt @@ -0,0 +1,30 @@ +package be.vandewalleh.aoc.days + +class Day14Test : BaseDayTest() { + override val example = """ + 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 + """.trimIndent() + + override val part1Example = 1588L + override val part1Answer = 3555L + + override val part2Example = 2188189693529 + override val part2Answer = 4439442043739 +}