Skip to content

Commit bc338bf

Browse files
committed
Day 14
1 parent c358ac9 commit bc338bf

File tree

2 files changed

+183
-0
lines changed

2 files changed

+183
-0
lines changed

2021/14/input.txt

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
FSHBKOOPCFSFKONFNFBB
2+
3+
FO -> K
4+
FF -> H
5+
SN -> C
6+
CC -> S
7+
BB -> V
8+
FK -> H
9+
PC -> P
10+
PH -> N
11+
OB -> O
12+
PV -> C
13+
BH -> B
14+
HO -> C
15+
VF -> H
16+
HB -> O
17+
VO -> N
18+
HK -> N
19+
OF -> V
20+
PF -> C
21+
KS -> H
22+
KV -> F
23+
PO -> B
24+
BF -> P
25+
OO -> B
26+
PS -> S
27+
KC -> P
28+
BV -> K
29+
OC -> B
30+
SH -> C
31+
SF -> P
32+
NH -> C
33+
BS -> C
34+
VH -> F
35+
CH -> S
36+
BC -> B
37+
ON -> K
38+
FH -> O
39+
HN -> O
40+
HS -> C
41+
KK -> V
42+
OK -> K
43+
VC -> H
44+
HV -> F
45+
FS -> H
46+
OV -> P
47+
HF -> F
48+
FB -> O
49+
CK -> O
50+
HP -> C
51+
NN -> V
52+
PP -> F
53+
FC -> O
54+
SK -> N
55+
FN -> K
56+
HH -> F
57+
BP -> O
58+
CP -> K
59+
VV -> S
60+
BO -> N
61+
KN -> S
62+
SB -> B
63+
SC -> H
64+
OS -> S
65+
CF -> K
66+
OP -> P
67+
CO -> C
68+
VK -> C
69+
NB -> K
70+
PB -> S
71+
FV -> B
72+
CS -> C
73+
HC -> P
74+
PK -> V
75+
BK -> P
76+
KF -> V
77+
NS -> P
78+
SO -> C
79+
CV -> P
80+
NP -> V
81+
VB -> F
82+
KO -> C
83+
KP -> F
84+
KH -> N
85+
VN -> S
86+
NO -> P
87+
NF -> K
88+
CB -> H
89+
VS -> V
90+
NK -> N
91+
KB -> C
92+
SV -> F
93+
NC -> H
94+
VP -> K
95+
PN -> H
96+
OH -> K
97+
CN -> N
98+
BN -> F
99+
NV -> K
100+
SP -> S
101+
SS -> K
102+
FP -> S

2021/14/main.py

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
from collections import defaultdict, Counter
2+
3+
4+
class Day14:
5+
6+
def __init__(self):
7+
self.puzzle_input = self.get_puzzle_input()
8+
9+
def part_one(self) -> int:
10+
return self.run_steps(steps=10)
11+
12+
def part_two(self) -> int:
13+
return self.run_steps(steps=40)
14+
15+
def run_steps(self, steps):
16+
data = self.get_puzzle_input().copy()
17+
18+
polymer_template = None
19+
pair_insertion_rules = defaultdict(str)
20+
21+
for line in data:
22+
if '->' in line:
23+
pair_from, pair_to = line.split(' -> ')
24+
pair_insertion_rules[pair_from] = pair_to
25+
elif line != '':
26+
polymer_template = list(line)
27+
28+
polymer_template_pairs = defaultdict(int)
29+
for i in range(len(polymer_template) - 1):
30+
a, b = polymer_template[i], polymer_template[i + 1]
31+
polymer_template_pairs[a + b] += 1
32+
33+
for i in range(steps):
34+
polymer_template_pairs = self.find_new_pairs(polymer_template_pairs, pair_insertion_rules)
35+
36+
letters = self.count_letters(polymer_template_pairs)
37+
letters[polymer_template[-1]] += 1
38+
39+
c = Counter(letters)
40+
most_letter, most_count = c.most_common()[0]
41+
least_letter, least_count = c.most_common()[-1]
42+
43+
return most_count - least_count
44+
45+
@staticmethod
46+
def count_letters(polymer_template_pairs):
47+
letters = defaultdict(int)
48+
for key, value in polymer_template_pairs.items():
49+
first_letter = key[0]
50+
letters[first_letter] += value
51+
52+
return letters
53+
54+
@staticmethod
55+
def find_new_pairs(polymer_template, pair_insertion_rules):
56+
new_polymer_template = defaultdict(int)
57+
58+
for key, value in polymer_template.items():
59+
60+
first_letter = key[0]
61+
second_letter = key[1]
62+
63+
new_letter = pair_insertion_rules[key]
64+
65+
new_polymer_template[first_letter + new_letter] += value
66+
new_polymer_template[new_letter + second_letter] += value
67+
68+
return new_polymer_template
69+
70+
@staticmethod
71+
def get_puzzle_input() -> list:
72+
lst = []
73+
with open("input.txt") as file:
74+
for line in file:
75+
lst.append(line.rstrip())
76+
return lst
77+
78+
79+
day = Day14()
80+
print(f'Result part 1: {day.part_one()}')
81+
print(f'Result part 2: {day.part_two()}')

0 commit comments

Comments
 (0)