Update day 14 solution
All checks were successful
continuous-integration/drone/push Build is passing

Tidy up
This commit is contained in:
2021-12-14 09:20:25 +01:00
parent ae2666fb02
commit 56ee86026d

View File

@@ -3,16 +3,15 @@ from pathlib import Path
from collections import defaultdict from collections import defaultdict
def part_1(input): def solve(input, part, num_cycles):
result = 0 result = 0
template = input.pop(0).strip() template = input[0].strip()
input.pop(0) rules = {k: v
rules = {k.strip(): v.strip() for line in input[2:] for k, v in [line.strip().split(' -> ')]}
for line in input for k, v in [line.strip().split('->')]}
counts = defaultdict(int) counts = defaultdict(int)
for i in range(len(template) - 1): for i in range(len(template) - 1):
counts[template[i: i + 2]] += 1 counts[template[i: i + 2]] += 1
for _ in range(10): for _ in range(num_cycles):
tmp_cnts = counts.copy() tmp_cnts = counts.copy()
for k in tmp_cnts: for k in tmp_cnts:
if k in rules: if k in rules:
@@ -28,46 +27,15 @@ def part_1(input):
char_counts[template[-1]] += 1 char_counts[template[-1]] += 1
for k in char_counts: for k in char_counts:
char_counts[k] //= 2 char_counts[k] //= 2
char_counts = sorted(char_counts.items(), counts = [char_counts[k] // 2 for k in char_counts]
key=lambda kv: kv[1]) result = max(counts) - min(counts)
result = char_counts[-1][1] - char_counts[0][1] print("Part", part, "result:", result)
print("Part 1 result:", result)
def part_2(input):
result = 0
template = input.pop(0).strip()
input.pop(0)
rules = {k.strip(): v.strip()
for line in input for k, v in [line.strip().split('->')]}
counts = defaultdict(int)
for i in range(len(template) - 1):
counts[template[i: i + 2]] += 1
for _ in range(40):
tmp_cnts = counts.copy()
for k in tmp_cnts:
if k in rules:
c = tmp_cnts[k]
counts[k] -= c
counts[k[0] + rules[k]] += c
counts[rules[k] + k[1]] += c
char_counts = defaultdict(int)
for k in counts:
char_counts[k[0]] += counts[k]
char_counts[k[1]] += counts[k]
char_counts[template[0]] += 1
char_counts[template[-1]] += 1
for k in char_counts:
char_counts[k] //= 2
char_counts = sorted(char_counts.items(),
key=lambda kv: kv[1])
result = char_counts[-1][1] - char_counts[0][1]
print("Part 2 result:", result)
input = list() input = list()
p = Path(__file__).with_name('input.txt') p = Path(__file__).with_name('input.txt')
with open(p) as f: with open(p) as f:
input = f.readlines() input = f.readlines()
part_1(input.copy()) solve(input, 1, 10)
part_2(input.copy()) solve(input, 2, 40)