-
Notifications
You must be signed in to change notification settings - Fork 0
/
Day19.py
89 lines (72 loc) · 3.77 KB
/
Day19.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
86
87
88
89
from DataReader import AdventDay
import re
class AdventDayNineteen(AdventDay):
input_value = 'CRnSiRnCaPTiMgYCaPTiRnFArSiThFArCaSiThSiThPBCaCaSiRnSiRnTiTiMgArPBCaPMgYPTiRnFArFArCaSiRnBPMgArPRnCaPTiRnFArCaSiThCaCaFArPBCaCaPTiTiRnFArCaSiRnSiAlYSiThRnFArArCaSiRnBFArCaCaSiRnSiThCaCaCaFYCaPTiBCaSiThCaSiThPMgArSiRnCaPBFYCaCaFArCaCaCaCaSiThCaSiRnPRnFArPBSiThPRnFArSiRnMgArCaFYFArCaSiRnSiAlArTiTiTiTiTiTiTiRnPMgArPTiTiTiBSiRnSiAlArTiTiRnPMgArCaFYBPBPTiRnSiRnMgArSiThCaFArCaSiThFArPRnFArCaSiRnTiBSiThSiRnSiAlYCaFArPRnFArSiThCaFArCaCaSiThCaCaCaSiRnPRnCaFArFYPMgArCaPBCaPBSiRnFYPBCaFArCaSiAl'
def __init__(self):
AdventDay.__init__(self, 19)
self.answers_part2 = 0
def answer_part1(self):
answers = set()
replacements_array = self.parse_replacements()
for one_replacement in replacements_array:
replacement = one_replacement[0]
replace_with = one_replacement[1]
start_point = 0
while start_point != -1:
new_combination = self.replace_one_instance(self.input_value, replacement, replace_with, start_point)
if new_combination[0] != -1:
answers.add(new_combination[1])
start_point = new_combination[0] + 1
if start_point == len(self.input_value):
start_point = -1
else:
start_point = -1
return len(answers)
def answer_part2(self):
replacements = self.parse_replacements_part2()
self.tear_down_string(self.input_value, 0, '', replacements)
return self.answers_part2
def tear_down_string(self, input_value, replacement_count, previous_value, replacements):
if input_value == 'e':
if self.answers_part2 == 0 or replacement_count < self.answers_part2:
self.answers_part2 = replacement_count
return
if self.answers_part2 != 0 and replacement_count >= self.answers_part2:
return
if input_value == previous_value or (previous_value != '' and len(input_value) > len(previous_value)):
return
for replacement, options in replacements.items():
for one_option in options:
result = self.replace_one_instance(input_value, one_option, replacement, 0)
if result[0] != -1:
self.tear_down_string(result[1], replacement_count + 1, input_value, replacements)
return
def parse_replacements_part2(self):
replacements = {}
for one_string in self.read_data():
parts = re.findall(r'(\w+) => (\w+)', one_string)[0]
if parts[0] not in replacements.keys():
replacements[parts[0]] = []
replacements[parts[0]].append(parts[1])
sorted_replacements = {}
for replacement, value in replacements.items():
sorted_replacements[replacement] = sorted(value, key=len, reverse=True)
return sorted_replacements
@staticmethod
def replace_one_instance(input, replacement, replace_with, start_point):
index = input.find(replacement, start_point)
if index == -1:
return [-1, '']
begin_part = input[:index]
end_part = re.sub(replacement, replace_with, input[index:], 1)
return [index, begin_part + end_part]
def parse_replacements(self):
replacements = []
for one_string in self.read_data():
parts = re.findall(r'(\w+) => (\w+)', one_string)[0]
replacements.append(parts)
return replacements
adventDay19_1 = AdventDayNineteen()
adventDay19_2 = AdventDayNineteen()
print("Day 19 Part 1: {answer}".format(answer=adventDay19_1.answer_part1()))
print("Day 19 Part 2: {answer}".format(answer=adventDay19_2.answer_part2()))