Files
python-aoc-2020/day19/part2.py
Sebastian Seedorf 1bcc600b3b Day 19 (glamorized)
2020-12-19 13:19:45 +01:00

41 lines
1.0 KiB
Python

#!/usr/bin/env python3
lines = (x.strip() for x in open("input.txt"))
rules = {}
sum = 0
def yield_rule(line, rule, depth):
if len(rule) > 0:
elem, *tail = rule
for rest in check(line, elem, depth-1):
yield from yield_rule(rest, tail, depth-1)
else:
yield line
def check(line, idx, depth):
if depth < 0:
return
rs = rules[idx]
if not isinstance(rs, str):
for rule in rules[idx]:
yield from yield_rule(line, rule, depth)
elif line.startswith(rs):
yield line[len(rs):]
for line in lines:
line = '11: 42 31 | 42 11 31' if line.startswith('11:') else line
line = '8: 42 | 42 8' if line.startswith('8:') else line
if ":" in line:
idx, r = line.split(": ")
idx = int(idx)
r = r[1:len(r)-1] if r.startswith('"') else [list(map(int, x.split())) for x in r.split(" | ")]
rules[idx] = r
elif line != "":
for rest in check(line, 0, len(line)):
if rest == "":
sum += 1
print(sum)