Again Elves are back. This time a problem was not that hard to solve but still was time consuming as previous versions. I again took help from reddit thread, specially from here.
def rule_maker(raw_rules):
rules = {}
for rule in raw_rules:
key, value = rule.split(': ')
if value[0] == '"':
rules[int(key)] = value[1:-1]
else:
values = value.split(' | ')
temp_v = []
for v in values:
temp_v.append([int(vv) for vv in v.split(' ')])
rules[int(key)] = temp_v
return rules
def match_rule(expr, stack):
if len(stack) > len(expr):
return False
elif len(stack) == 0 or len(expr) == 0:
return len(stack) == 0 and len(expr) == 0
c = stack.pop()
if isinstance(c, str):
if expr[0] == c:
return match_rule(expr[1:], stack.copy())
else:
for rule in rules[c]:
if match_rule(expr, stack + list(reversed(rule))):
return True
return False
def count_messages(rules, messages):
total = 0
for message in messages:
if match_rule(message, list(reversed(rules[0][0]))):
total += 1
return total
with open("day19.txt") as fp:
raw_rules, message = fp.read().split('\n\n')
raw_rules = raw_rules.splitlines()
message = message.splitlines()
rules = rule_maker(raw_rules)
print(f"Part 1: {count_messages(rules, message)}")
rules[8] = [[42], [42, 8]]
rules[11] = [[42, 31], [42, 11, 31]]
print(f"Part 2: {count_messages(rules, message)}")
# rules[0]
Top comments (0)