Day 14
This commit is contained in:
parent
9a350e8eea
commit
6ac2daf309
32
2021/day14.py
Normal file
32
2021/day14.py
Normal file
|
@ -0,0 +1,32 @@
|
|||
from collections import defaultdict
|
||||
from math import ceil
|
||||
|
||||
with open("input14.txt") as f:
|
||||
lines = [line.rstrip() for line in f]
|
||||
template = lines[0]
|
||||
rules = {k: v for k, v in map(lambda s: s.split(" -> "), lines[2:])}
|
||||
pairs = defaultdict(int)
|
||||
for i in range(len(template) - 1):
|
||||
pairs[template[i:i+2]] += 1
|
||||
# N B B B C N C C N B B N B N B B C H B H H B C H B
|
||||
# NB BB BB BC CN NC CC CN NB BB BN NB BN NB BB BC CH HB BH HH HB BC CH HB
|
||||
# N=5, B=11, C=5, H=4, but in pairs N=9, B=21, C=10, H=8
|
||||
# so if odd: n+1 / 2 elif even: n / 2, which is ceil(n / 2) for both
|
||||
for step in range(40):
|
||||
for pair, n in list(pairs.items()):
|
||||
if pairs[pair] == 0:
|
||||
continue
|
||||
mid = rules[pair]
|
||||
new_pair1, new_pair2 = pair[0] + mid, mid + pair[1]
|
||||
pairs[pair] -= n
|
||||
pairs[new_pair1] += n
|
||||
pairs[new_pair2] += n
|
||||
if step in (9, 39):
|
||||
pcount = defaultdict(int)
|
||||
for pair, n in pairs.items():
|
||||
for p in pair:
|
||||
pcount[p] += n
|
||||
tcount = {p: ceil(n / 2) for p, n in pcount.items()}
|
||||
most_common = max(tcount, key=lambda p: tcount[p])
|
||||
least_common = min(tcount, key=lambda p: tcount[p])
|
||||
print(tcount[most_common] - tcount[least_common])
|
Loading…
Reference in a new issue