-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday5.py
More file actions
71 lines (46 loc) · 1.87 KB
/
Copy pathday5.py
File metadata and controls
71 lines (46 loc) · 1.87 KB
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
from typing import Tuple
TEST = 'dabAcCaCBAcCcaDA'
def pairs(polymer: str) -> Tuple[str, str]:
""" Generates all adjacent character pairs"""
it = iter(polymer)
prev = next(it)
for index, char in enumerate(it):
yield (prev, char, index)
prev = char
def same_type(s1: str, s2: str) -> bool:
"""A and a are the same type"""
return s1.lower() == s2.lower()
def scan(polymer: str) -> str:
if any([same_type(pair[0], pair[1]) and pair[0] != pair[1] for pair in pairs(polymer)]):
return alchreduce(polymer)
else:
return polymer
def alchreduce(polymer: str) -> str:
to_delete = set()
monomers = list(polymer)
count = 0
for pair in pairs(polymer):
count += 1
if count >= len(polymer) - 1:
# if we have run through all the pairs
# complete reaction and scan for other reactive monomers
reduced = ''.join(unit for i, unit in enumerate(monomers) if i not in to_delete)
return scan(reduced)
elif same_type(pair[0], pair[1]) and pair[0] != pair[1]:
to_delete.add(pair[2])
to_delete.add(pair[2]+1)
# once a reacting monomer tuple is identified
# react them and check if any remaining reactive monomers
# are in the resulting sequence
reduced = ''.join(unit for i, unit in enumerate(monomers) if i not in to_delete)
return scan(reduced)
else:
pass
return ''.join(unit for i, unit in enumerate(monomers) if i not in to_delete)
assert alchreduce("abAB") == "abAB"
assert alchreduce("dabAcCaCBAcCcaDA") == "dabCBAcaDA"
#print(alchreduce(TEST))
with open('C:/Python/projects/adventofcode/data/polymer.txt') as f:
#polymer = [line.strip() for line in f]
polymer = f.read()
alchreduce(polymer)