#!/usr/bin/env python3 lines = (x.strip() for x in open("input.txt")) rules = {} cnt = 0 def yield_rule(line, rule): if len(rule) > 0: elem, *tail = rule for rest in check(line, elem): yield from yield_rule(rest, tail) else: yield line def check(line, idx): rs = rules[idx] if not isinstance(rs, str): for rule in rules[idx]: yield from yield_rule(line, rule) elif line.startswith(rs): yield line[len(rs):] for line in lines: 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 != "": cnt += 1 if next(check(line, 0), None) == "" else 0 print(cnt)