From 55e62174db1fe310e3d3cd7d11318465b7fea958 Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Tue, 14 Dec 2021 06:43:48 +0100 Subject: [PATCH] day14 --- day14.py | 47 ++++++++++++++++++ inputs/input14 | 102 ++++++++++++++++++++++++++++++++++++++++ inputs/test_input14_1_0 | 18 +++++++ inputs/test_input14_1_1 | 102 ++++++++++++++++++++++++++++++++++++++++ inputs/test_input14_2_0 | 18 +++++++ inputs/test_input14_2_1 | 102 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 389 insertions(+) create mode 100644 day14.py create mode 100644 inputs/input14 create mode 100644 inputs/test_input14_1_0 create mode 100644 inputs/test_input14_1_1 create mode 100644 inputs/test_input14_2_0 create mode 100644 inputs/test_input14_2_1 diff --git a/day14.py b/day14.py new file mode 100644 index 0000000..e413efb --- /dev/null +++ b/day14.py @@ -0,0 +1,47 @@ +from tools.aoc import AOCDay +from typing import Any, Dict, List + + +def getInitialDicts(puzzle: List[str]) -> (Dict[str, int], Dict[str, int], Dict[str, str]): + polymer = puzzle[0] + inserts = {} + for p1 in puzzle[2:]: + pair, insert_char = p1.split(" -> ") + inserts[pair] = insert_char + + pairs = {} + charcount = {} + for x in range(len(polymer) - 1): + pairs[polymer[x:x + 2]] = pairs.get(polymer[x:x + 2], 0) + 1 + charcount[polymer[x]] = charcount.get(polymer[x], 0) + 1 + + charcount[polymer[-1]] = charcount.get(polymer[-1], 0) + 1 + + return pairs, charcount, inserts + + +def insert(pairs: Dict[str, int], charcount: Dict[str, int], inserts: Dict[str, str], count: int): + for _ in range(count): + new_pairs = {} + for p in pairs: + p1 = p[0] + inserts[p] + p2 = inserts[p] + p[1] + charcount[inserts[p]] = charcount.get(inserts[p], 0) + pairs[p] + new_pairs[p1] = new_pairs.get(p1, 0) + pairs[p] + new_pairs[p2] = new_pairs.get(p2, 0) + pairs[p] + pairs = new_pairs + + +class Day(AOCDay): + test_solutions_p1 = [1588, 3230] + test_solutions_p2 = [2188189693529, 3542388214529] + + def part1(self) -> Any: + pairs, charcount, inserts = getInitialDicts(self.getInput()) + insert(pairs, charcount, inserts, 10) + return max(charcount.values()) - min(charcount.values()) + + def part2(self) -> Any: + pairs, charcount, inserts = getInitialDicts(self.getInput()) + insert(pairs, charcount, inserts, 40) + return max(charcount.values()) - min(charcount.values()) diff --git a/inputs/input14 b/inputs/input14 new file mode 100644 index 0000000..0400f1a --- /dev/null +++ b/inputs/input14 @@ -0,0 +1,102 @@ +NCOPHKVONVPNSKSHBNPF + +ON -> C +CK -> H +HC -> B +NP -> S +NH -> H +CB -> C +BB -> H +BC -> H +NN -> C +OH -> B +SF -> V +PB -> H +CP -> P +BN -> O +NB -> B +KB -> P +PV -> F +SH -> V +KP -> S +OF -> K +BS -> V +PF -> O +BK -> S +FB -> B +SV -> B +BH -> V +VK -> N +CS -> V +FV -> F +HS -> C +KK -> O +SP -> N +FK -> B +CF -> C +HP -> F +BF -> O +KC -> C +VP -> O +BP -> P +FF -> V +NO -> C +HK -> C +HV -> B +PK -> P +OV -> F +VN -> H +PC -> K +SB -> H +VO -> V +BV -> K +NC -> H +OB -> S +SN -> B +HF -> P +VF -> B +HN -> H +KS -> S +SC -> S +CV -> B +NS -> P +KO -> V +FS -> O +PH -> K +BO -> C +FH -> B +CO -> O +FO -> F +VV -> N +CH -> V +NK -> N +PO -> K +OK -> K +PP -> O +OC -> P +FC -> N +VH -> S +PN -> C +VB -> C +VS -> P +HO -> F +OP -> S +HB -> N +CC -> K +KN -> S +SK -> C +OS -> N +KH -> B +FP -> S +NF -> S +CN -> S +KF -> C +SS -> C +SO -> S +NV -> O +FN -> B +PS -> S +HH -> C +VC -> S +OO -> C +KV -> P diff --git a/inputs/test_input14_1_0 b/inputs/test_input14_1_0 new file mode 100644 index 0000000..b5594dd --- /dev/null +++ b/inputs/test_input14_1_0 @@ -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 diff --git a/inputs/test_input14_1_1 b/inputs/test_input14_1_1 new file mode 100644 index 0000000..0400f1a --- /dev/null +++ b/inputs/test_input14_1_1 @@ -0,0 +1,102 @@ +NCOPHKVONVPNSKSHBNPF + +ON -> C +CK -> H +HC -> B +NP -> S +NH -> H +CB -> C +BB -> H +BC -> H +NN -> C +OH -> B +SF -> V +PB -> H +CP -> P +BN -> O +NB -> B +KB -> P +PV -> F +SH -> V +KP -> S +OF -> K +BS -> V +PF -> O +BK -> S +FB -> B +SV -> B +BH -> V +VK -> N +CS -> V +FV -> F +HS -> C +KK -> O +SP -> N +FK -> B +CF -> C +HP -> F +BF -> O +KC -> C +VP -> O +BP -> P +FF -> V +NO -> C +HK -> C +HV -> B +PK -> P +OV -> F +VN -> H +PC -> K +SB -> H +VO -> V +BV -> K +NC -> H +OB -> S +SN -> B +HF -> P +VF -> B +HN -> H +KS -> S +SC -> S +CV -> B +NS -> P +KO -> V +FS -> O +PH -> K +BO -> C +FH -> B +CO -> O +FO -> F +VV -> N +CH -> V +NK -> N +PO -> K +OK -> K +PP -> O +OC -> P +FC -> N +VH -> S +PN -> C +VB -> C +VS -> P +HO -> F +OP -> S +HB -> N +CC -> K +KN -> S +SK -> C +OS -> N +KH -> B +FP -> S +NF -> S +CN -> S +KF -> C +SS -> C +SO -> S +NV -> O +FN -> B +PS -> S +HH -> C +VC -> S +OO -> C +KV -> P diff --git a/inputs/test_input14_2_0 b/inputs/test_input14_2_0 new file mode 100644 index 0000000..b5594dd --- /dev/null +++ b/inputs/test_input14_2_0 @@ -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 diff --git a/inputs/test_input14_2_1 b/inputs/test_input14_2_1 new file mode 100644 index 0000000..0400f1a --- /dev/null +++ b/inputs/test_input14_2_1 @@ -0,0 +1,102 @@ +NCOPHKVONVPNSKSHBNPF + +ON -> C +CK -> H +HC -> B +NP -> S +NH -> H +CB -> C +BB -> H +BC -> H +NN -> C +OH -> B +SF -> V +PB -> H +CP -> P +BN -> O +NB -> B +KB -> P +PV -> F +SH -> V +KP -> S +OF -> K +BS -> V +PF -> O +BK -> S +FB -> B +SV -> B +BH -> V +VK -> N +CS -> V +FV -> F +HS -> C +KK -> O +SP -> N +FK -> B +CF -> C +HP -> F +BF -> O +KC -> C +VP -> O +BP -> P +FF -> V +NO -> C +HK -> C +HV -> B +PK -> P +OV -> F +VN -> H +PC -> K +SB -> H +VO -> V +BV -> K +NC -> H +OB -> S +SN -> B +HF -> P +VF -> B +HN -> H +KS -> S +SC -> S +CV -> B +NS -> P +KO -> V +FS -> O +PH -> K +BO -> C +FH -> B +CO -> O +FO -> F +VV -> N +CH -> V +NK -> N +PO -> K +OK -> K +PP -> O +OC -> P +FC -> N +VH -> S +PN -> C +VB -> C +VS -> P +HO -> F +OP -> S +HB -> N +CC -> K +KN -> S +SK -> C +OS -> N +KH -> B +FP -> S +NF -> S +CN -> S +KF -> C +SS -> C +SO -> S +NV -> O +FN -> B +PS -> S +HH -> C +VC -> S +OO -> C +KV -> P