day19
This commit is contained in:
parent
01782c5bfb
commit
bce004b604
|
|
@ -0,0 +1,58 @@
|
||||||
|
def read_input():
|
||||||
|
with open('day19/input') as reader:
|
||||||
|
text = reader.read()
|
||||||
|
rulesAsText, messagesAsText = text.split('\n\n')
|
||||||
|
messages = filter(lambda m: m != '', messagesAsText.split('\n'))
|
||||||
|
rulesToParse = rulesAsText.split('\n')
|
||||||
|
|
||||||
|
return rulesToParse, messages
|
||||||
|
|
||||||
|
|
||||||
|
def parse_rules(rulesToParse):
|
||||||
|
rules = {}
|
||||||
|
for line in rulesToParse:
|
||||||
|
name, production_of_rule = line.split(': ')
|
||||||
|
if production_of_rule in ('"a"', '"b"'):
|
||||||
|
rules[int(name)] = production_of_rule[1]
|
||||||
|
continue
|
||||||
|
split_productions = production_of_rule.split(' | ')
|
||||||
|
productions = list(map(lambda p: [int(x) for x in p.split(' ')], split_productions))
|
||||||
|
rules[int(name)] = productions
|
||||||
|
return rules
|
||||||
|
|
||||||
|
|
||||||
|
rulesToParse, messages = read_input()
|
||||||
|
rules = parse_rules(rulesToParse)
|
||||||
|
|
||||||
|
|
||||||
|
def verify_rule(message):
|
||||||
|
global rules
|
||||||
|
|
||||||
|
state = [([0], 0)]
|
||||||
|
while state:
|
||||||
|
current_rules, index = state.pop()
|
||||||
|
current_rule = current_rules.pop()
|
||||||
|
productions = rules[current_rule]
|
||||||
|
if productions in ('a', 'b'):
|
||||||
|
if message[index] == productions:
|
||||||
|
index += 1
|
||||||
|
if index >= len(message):
|
||||||
|
if len(current_rules) == 0:
|
||||||
|
# solution found
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
continue
|
||||||
|
elif len(current_rules) == 0:
|
||||||
|
# no more rules, but message continues. current state will not find anything anymore
|
||||||
|
continue
|
||||||
|
state.append((list(current_rules), index))
|
||||||
|
continue
|
||||||
|
|
||||||
|
for p in productions:
|
||||||
|
state.append((list(current_rules) + list(reversed(p)), index))
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
res = sum(map(lambda m: verify_rule(m), messages))
|
||||||
|
print(res)
|
||||||
Loading…
Reference in New Issue