-
Notifications
You must be signed in to change notification settings - Fork 1
/
part1.py
85 lines (62 loc) · 1.63 KB
/
part1.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
from collections import Counter
def parse_input(input):
rules = {}
template = ""
i = 0
for line in input:
if i == 0:
template = line.strip()
i+=1
if ' -> ' in line:
temp = line.split(' -> ')
rules[temp[0]] = temp[1]
return rules, template
def apply_rules(rules,template):
pairs = []
new_pairs = []
for i in range(len(template)-1):
pairs.append('{}{}'.format(template[i],template[i+1]))
for pair in pairs:
new_pairs.append('{}{}'.format(pair[0],rules[pair]))
new_pairs.append(template[len(template)-1])
return ''.join(new_pairs)
def grow(template,rules, steps):
for i in range(steps):
template = apply_rules(rules,template)
# print('After step {}: Len {}'.format(i+1,len(template)))
counts = Counter(template)
# print(counts)
# print(template)
find_max = max(counts.values())
find_min =min(counts.values())
print('Max:{}, Min:{}, Dif:{}'.format(find_max,find_min,find_max-find_min))
def main():
example = """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""".splitlines()
with open("input.txt") as infile:
input = [line.strip() for line in infile]
rules, template = parse_input(example)
print('Template: {}'.format(template))
# print(rules)
grow(template,rules,10)
rules, template = parse_input(input)
print('Template: {}'.format(template))
# print(rules)
grow(template,rules,10)
if __name__ == '__main__':
main()