diff --git a/day14/part1.py b/day14/part1.py index 29f6b79..2b75556 100644 --- a/day14/part1.py +++ b/day14/part1.py @@ -1,32 +1,27 @@ #!/usr/bin/env python3 import re -from collections import Counter +from collections import Counter, defaultdict lines = (x.strip() for x in open("input.txt")) first = next(lines) - -combinations = Counter(first[a:a+2] for a in range(len(first)-1)) -replacements = dict() - next(lines) +combinations = Counter(first[a:a+2] for a in range(len(first)-1)) +replacements = defaultdict(list) + for line in lines: - before, insert = re.match(r"([A-Z]{2}) -> ([A-Z])", line).groups() - replacements[before] = (before[0]+insert, insert+before[1]) + (a, b), insert = re.match(r"([A-Z]{2}) -> ([A-Z])", line).groups() + replacements[a+insert].append(a+b) + replacements[insert+b].append(a+b) for _ in range(10): - nxt = {} - for before, afters in replacements.items(): - for after in afters: - add = combinations.get(before, 0) + nxt.get(after, 0) - if add: - nxt[after] = add - combinations = nxt + combinations = { + k: sum_val for k, v in replacements.items() if (sum_val := sum(combinations.get(x, 0) for x in v)) > 0 + } -letters = {} +letters = Counter(first[0] + first[-1]) for key, cnt in combinations.items(): letters[key[0]] = letters.get(key[0], 0) + cnt letters[key[1]] = letters.get(key[1], 0) + cnt -print(letters) -print((max(*letters.values())+1) // 2 - (min(*letters.values())+1) // 2) +print((max(letters.values()) - min(letters.values())) // 2) diff --git a/day14/part2.py b/day14/part2.py index cf76aad..108a613 100644 --- a/day14/part2.py +++ b/day14/part2.py @@ -1,34 +1,27 @@ #!/usr/bin/env python3 import re -from collections import Counter +from collections import Counter, defaultdict lines = (x.strip() for x in open("input.txt")) first = next(lines) - -combinations = Counter(first[a:a+2] for a in range(len(first)-1)) -replacements = dict() - next(lines) +combinations = Counter(first[a:a+2] for a in range(len(first)-1)) +replacements = defaultdict(list) + for line in lines: - before, insert = re.match(r"([A-Z]{2}) -> ([A-Z])", line).groups() - replacements[before] = (before[0]+insert, insert+before[1]) -print(combinations) + (a, b), insert = re.match(r"([A-Z]{2}) -> ([A-Z])", line).groups() + replacements[a+insert].append(a+b) + replacements[insert+b].append(a+b) for _ in range(40): - nxt = {} - for before, afters in replacements.items(): - for after in afters: - add = combinations.get(before, 0) + nxt.get(after, 0) - if add: - nxt[after] = add - combinations = nxt - print(combinations) + combinations = { + k: sum_val for k, v in replacements.items() if (sum_val := sum(combinations.get(x, 0) for x in v)) > 0 + } -letters = {} +letters = Counter(first[0] + first[-1]) for key, cnt in combinations.items(): letters[key[0]] = letters.get(key[0], 0) + cnt letters[key[1]] = letters.get(key[1], 0) + cnt -print(letters) -print((max(*letters.values())+1) // 2 - (min(*letters.values())+1) // 2) +print((max(letters.values()) - min(letters.values())) // 2)