Add day 14 - phew

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
2021-12-17 16:17:02 -08:00
parent 61b862b656
commit 0a23902e3a
3 changed files with 188 additions and 0 deletions

68
day14/day14.py Executable file
View File

@@ -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)

18
day14/example.txt Normal file
View File

@@ -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

102
day14/input.txt Normal file
View File

@@ -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