diff --git a/day14/day14.py b/day14/day14.py new file mode 100755 index 0000000..e6b2403 --- /dev/null +++ b/day14/day14.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 +import sys +from collections import defaultdict, Counter +from typing import DefaultDict, Mapping +from copy import deepcopy + + +def apply_rules(template: str, rules: Mapping[str, str]) -> str: + # sliding window babey + new = "" + for i in range(len(template) - 1): + new += template[i] + rules[template[i : i + 2]] + return new + template[-1] + + +def part1(template: str, rules: Mapping[str, str]): + for i in range(10): + template = apply_rules(template, rules) + counts: DefaultDict[str, int] = defaultdict(lambda: 0) + for c in template: + counts[c] += 1 + counts_sorted = sorted(counts.items(), key=lambda pair: pair[1]) + _, least = counts_sorted[0] + _, most = counts_sorted[-1] + print(most - least) + + +def part2(template: str, rules: Mapping[str, str]): + # Apply rules with counts instead of building a string + counts: Counter = Counter() + + for i in range(len(template) - 1): + counts[template[i : i + 2]] += 1 + + for _ in range(40): + new_counts: Counter = Counter() + for pair, count in counts.items(): + # Create the two new pairs, and remove the old one + rule = rules[pair] + p1 = pair[0] + rule + p2 = rule + pair[1] + # Subtract from this pair, and then add the new ones + new_counts[p1] += counts[pair] + new_counts[p2] += counts[pair] + counts = new_counts + # Count all the letters, only using the first character. + # If we count the second character, we double-count. + letters: Counter = Counter() + for pair in counts: + letters[pair[0]] += counts[pair] + # We just need to count the last character in the original template - since this never changes. + letters[template[-1]] += 1 + print(max(letters.values()) - min(letters.values())) + + +template = sys.stdin.readline().strip() +# blank +sys.stdin.readline() +rules = { + rule: translate.strip() + for rule, translate in map(lambda line: line.split(" -> "), sys.stdin) +} + + +print("Part 1") +part1(template, rules) +print("Part 2") +part2(template, rules) diff --git a/day14/example.txt b/day14/example.txt new file mode 100644 index 0000000..6c1c3a1 --- /dev/null +++ b/day14/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 \ No newline at end of file diff --git a/day14/input.txt b/day14/input.txt new file mode 100644 index 0000000..5fef7e8 --- /dev/null +++ b/day14/input.txt @@ -0,0 +1,102 @@ +SHHBNFBCKNHCNOSHHVFF + +CK -> N +VP -> B +CF -> S +FO -> V +VC -> S +BV -> V +NP -> P +SN -> C +KN -> V +NF -> P +SB -> C +PC -> B +OB -> V +NS -> O +FH -> S +NK -> S +HO -> V +NV -> O +FV -> O +FB -> S +PS -> S +FN -> K +HS -> O +CB -> K +HV -> P +NH -> C +BO -> B +FF -> N +PO -> F +BB -> N +PN -> C +BP -> C +HN -> K +CO -> P +BF -> H +BC -> S +CV -> B +VV -> F +FS -> B +BN -> P +VK -> S +PV -> V +PP -> B +PH -> N +SS -> O +SK -> S +NC -> P +ON -> F +NB -> N +CC -> N +SF -> H +PF -> H +OV -> O +KH -> C +CP -> V +PK -> O +KC -> K +KK -> C +KF -> B +HP -> C +FK -> H +BH -> K +VN -> H +OO -> S +SC -> K +SP -> B +KO -> V +KV -> F +HK -> N +FP -> N +NN -> B +VS -> O +HC -> K +BK -> N +KS -> K +VB -> O +OH -> F +KB -> F +KP -> H +HB -> N +NO -> N +OF -> O +BS -> H +VO -> H +SH -> O +SV -> K +HF -> C +CS -> F +FC -> N +VH -> H +OP -> K +OK -> H +PB -> K +HH -> S +OC -> V +VF -> B +CH -> K +CN -> C +SO -> P +OS -> O \ No newline at end of file