From 2376d7a492239cf4dc5745246149bdab73112cf9 Mon Sep 17 00:00:00 2001 From: Joscha Date: Thu, 23 Dec 2021 23:35:11 +0000 Subject: [PATCH] [py] Solve 2021_14 --- py/2021/14.py | 51 ++++++++++++++++++ py/2021/input_14.txt | 102 +++++++++++++++++++++++++++++++++++ py/2021/input_14_example.txt | 18 +++++++ 3 files changed, 171 insertions(+) create mode 100644 py/2021/14.py create mode 100644 py/2021/input_14.txt create mode 100644 py/2021/input_14_example.txt diff --git a/py/2021/14.py b/py/2021/14.py new file mode 100644 index 0000000..62ddce5 --- /dev/null +++ b/py/2021/14.py @@ -0,0 +1,51 @@ +import argparse +from pathlib import Path +from collections import Counter + +def step(pairs, rules): + result = Counter() + for pair, amount in pairs.items(): + if pair in rules: + a, b = rules[pair] + result[a] += amount + result[b] += amount + else: + result[pair] += amount + return result + +def count_chars(template, pairs): + chars = Counter() + for pair, amount in pairs.items(): + chars[pair[0]] += amount + chars[template[-1]] += 1 + return chars + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("file", type=Path) + args = parser.parse_args() + + with open(args.file) as f: + template = next(f).strip() + next(f) + rules = {} + for line in f: + pair, char = line.strip().split(" -> ") + rules[pair] = (pair[0] + char, char + pair[1]) + + pairs = Counter(template[i:i+2] for i in range(len(template) - 1)) + + for i in range(10): + pairs = step(pairs, rules) + + chars = count_chars(template, pairs).most_common() + print(f"Part 1: {chars[0][1] - chars[-1][1]}") + + for i in range(30): # 40 steps total + pairs = step(pairs, rules) + + chars = count_chars(template, pairs).most_common() + print(f"Part 2: {chars[0][1] - chars[-1][1]}") + +if __name__ == "__main__": + main() diff --git a/py/2021/input_14.txt b/py/2021/input_14.txt new file mode 100644 index 0000000..56c7184 --- /dev/null +++ b/py/2021/input_14.txt @@ -0,0 +1,102 @@ +BNSOSBBKPCSCPKPOPNNK + +HH -> N +CO -> F +BC -> O +HN -> V +SV -> S +FS -> F +CV -> F +KN -> F +OP -> H +VN -> P +PF -> P +HP -> H +FK -> K +BS -> F +FP -> H +FN -> V +VV -> O +PS -> S +SK -> N +FF -> K +PK -> V +OF -> N +VP -> K +KB -> H +OV -> B +CH -> F +SF -> F +NH -> O +NC -> N +SP -> N +NN -> F +OK -> S +BB -> S +NK -> S +FH -> P +FC -> S +OB -> P +VS -> P +BF -> S +HC -> V +CK -> O +NP -> K +KV -> S +OS -> V +CF -> V +FB -> C +HO -> S +BV -> V +KS -> C +HB -> S +SO -> N +PH -> C +PN -> F +OC -> F +KO -> F +VF -> V +CS -> O +VK -> O +FV -> N +OO -> K +NS -> S +KK -> C +FO -> S +PV -> S +CN -> O +VC -> P +SS -> C +PO -> P +BN -> N +PB -> N +PC -> H +SH -> K +BH -> F +HK -> O +VB -> P +NV -> O +NB -> C +CP -> H +NO -> K +PP -> N +CC -> S +CB -> K +VH -> H +SC -> C +KC -> N +SB -> B +BP -> P +KP -> K +SN -> H +KF -> K +KH -> B +HV -> V +HS -> K +NF -> B +ON -> H +BO -> P +VO -> K +OH -> C +HF -> O +BK -> H diff --git a/py/2021/input_14_example.txt b/py/2021/input_14_example.txt new file mode 100644 index 0000000..b5594dd --- /dev/null +++ b/py/2021/input_14_example.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