76 lines
2.2 KiB
Python
Executable File
76 lines
2.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
from collections import Counter
|
|
|
|
|
|
def create_semi_memo(tenth, pair_insertion):
|
|
for key in pair_insertion.keys():
|
|
key_l = [ x for x in key ]
|
|
p_t, elements = do_insert(key_l, pair_insertion, 10)
|
|
tenth[key] = [p_t[1:-1], elements]
|
|
|
|
|
|
def do_final_insert(polymer_template, tenth, final_elements, iterations):
|
|
for count in range(1,iterations + 1):
|
|
length_pt = len(polymer_template)
|
|
for index in range(1, length_pt + 1):
|
|
if(index == length_pt):
|
|
break
|
|
p_t = f'{polymer_template[-index*2]}{polymer_template[-index*2+1]}'
|
|
for zindex in range(len(tenth[p_t][0])):
|
|
polymer_template.insert(-index*2+1+zindex, tenth[p_t][0][zindex])
|
|
final_elements = Counter(final_elements) + Counter(tenth[p_t][1])
|
|
|
|
return final_elements
|
|
|
|
|
|
def do_insert(polymer_template, pair_insertion, iterations):
|
|
elements = dict()
|
|
for count in range(1,iterations + 1):
|
|
length_pt = len(polymer_template)
|
|
for index in range(1, length_pt + 1):
|
|
if(index == length_pt):
|
|
break
|
|
p_t = f'{polymer_template[-index*2]}{polymer_template[-index*2+1]}'
|
|
polymer_template.insert(-index*2+1, pair_insertion[p_t])
|
|
try:
|
|
elements[pair_insertion[p_t]] += 1
|
|
except KeyError:
|
|
elements[pair_insertion[p_t]] = 1
|
|
print(count)
|
|
|
|
return polymer_template, elements
|
|
|
|
|
|
def main():
|
|
with open('day14', 'r') as file:
|
|
lines = file.readlines()
|
|
|
|
polymer_template = lines[0].strip()
|
|
pair_insertion = dict()
|
|
final_elements = dict()
|
|
tenth = dict()
|
|
|
|
for line in lines[2:]:
|
|
line = line.strip().split()
|
|
pair_insertion[line[0]] = line[2]
|
|
|
|
for polymer in polymer_template:
|
|
try:
|
|
final_elements[polymer] += 1
|
|
except KeyError:
|
|
final_elements[polymer] = 1
|
|
|
|
polymer_template = [ x for x in polymer_template ]
|
|
|
|
polymer_template, elements = do_insert(polymer_template, pair_insertion, 40)
|
|
|
|
maxi = max(list(elements.values()))
|
|
mixi = min(list(elements.values()))
|
|
|
|
|
|
print(maxi-mixi)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|