From 103ee891b249ed35c03df507f57e0044c7fdfd15 Mon Sep 17 00:00:00 2001 From: dave Date: Mon, 13 Dec 2021 21:43:08 -0800 Subject: [PATCH] day 14 --- 14/a.py | 41 ++++++++++++++++++++ 14/b.py | 48 ++++++++++++++++++++++++ 14/input.txt | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++ 14/sample.txt | 18 +++++++++ 4 files changed, 209 insertions(+) create mode 100644 14/a.py create mode 100644 14/b.py create mode 100644 14/input.txt create mode 100644 14/sample.txt diff --git a/14/a.py b/14/a.py new file mode 100644 index 0000000..3786eb5 --- /dev/null +++ b/14/a.py @@ -0,0 +1,41 @@ +from collections import defaultdict + + +rules = {} + + +# with open("sample.txt") as f: +with open("input.txt") as f: + start_poly = f.readline().strip() + f.readline() + for line in f.readlines(): + l, r = line.strip().split(" -> ") + rules[l] = r + + +def mutate(poly): + new_poly = [] + for i in range(0, len(poly)): + a = poly[i] + if i == len(poly) - 1: + new_poly.append(a) + break + b = poly[i + 1] + pair = a + b + new_poly.append(a) + new_poly.append(rules[pair]) + + return ''.join(new_poly) + + +for i in range(0, 10): + start_poly = mutate(start_poly) + +counts = defaultdict(lambda: 0) + +for c in start_poly: + counts[c] += 1 + +counts = sorted(counts.values()) + +print(counts[-1] - counts[0]) diff --git a/14/b.py b/14/b.py new file mode 100644 index 0000000..a53641a --- /dev/null +++ b/14/b.py @@ -0,0 +1,48 @@ +from collections import defaultdict + + +rules = {} + + +# with open("sample.txt") as f: +with open("input.txt") as f: + sp = list(f.readline().strip()) + f.readline() + for line in f.readlines(): + l, r = line.strip().split(" -> ") + rules[l] = r + + +start_poly = defaultdict(lambda: 0) +for i in range(0, len(sp) - 1): + start_poly[sp[i] + sp[i + 1]] += 1 + + +def mutate(poly): + new_poly = defaultdict(lambda: 0) + for pair, count in poly.items(): + new_c = rules[pair] + np1 = pair[0] + new_c + np2 = new_c + pair[1] + new_poly[np1] += count + new_poly[np2] += count + return new_poly + + +def get_counts(d): + counts = defaultdict(lambda: 0) + for chars, count in d.items(): + counts[chars[0]] += count # only count 1st letter, the second was duplicated in a later pair + + # except the last char in the original sequence + counts[sp[-1]] += 1 + + return dict(counts) + + +for i in range(0, 40): + start_poly = mutate(start_poly) + +counts = sorted(get_counts(start_poly).values()) + +print(counts[-1] - counts[0]) diff --git a/14/input.txt b/14/input.txt new file mode 100644 index 0000000..ca2368b --- /dev/null +++ b/14/input.txt @@ -0,0 +1,102 @@ +BNBBNCFHHKOSCHBKKSHN + +CH -> S +KK -> V +FS -> V +CN -> P +VC -> N +CB -> V +VK -> H +CF -> N +PO -> O +KC -> S +HC -> P +PP -> B +KO -> B +BK -> P +BH -> N +CC -> N +PC -> O +FK -> N +KF -> F +FH -> S +SS -> V +ON -> K +OV -> K +NK -> H +BO -> C +VP -> O +CS -> V +KS -> K +SK -> B +OP -> S +PK -> S +HF -> P +SV -> P +SB -> C +BC -> C +FP -> H +FC -> P +PB -> N +NV -> F +VO -> F +VH -> P +BB -> N +SF -> F +NB -> K +KB -> S +VV -> S +NP -> N +SO -> O +PN -> B +BP -> H +BV -> V +OB -> C +HV -> N +PF -> B +SP -> N +HN -> N +CV -> H +BN -> V +PS -> V +CO -> S +BS -> N +VB -> H +PV -> P +NN -> P +HS -> C +OS -> P +FB -> S +HO -> C +KH -> H +HB -> K +VF -> S +CK -> K +FF -> H +FN -> P +OK -> F +SC -> B +HH -> N +OH -> O +VS -> N +FO -> N +OC -> H +NF -> F +PH -> S +HK -> K +NH -> H +FV -> S +OF -> V +NC -> O +HP -> O +KP -> B +BF -> N +NO -> S +CP -> C +NS -> N +VN -> K +KV -> N +OO -> V +SN -> O +KN -> C +SH -> F diff --git a/14/sample.txt b/14/sample.txt new file mode 100644 index 0000000..6c1c3a1 --- /dev/null +++ b/14/sample.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 \ No newline at end of file