import re def memo(f): memo = {} def f2(x): if x not in memo: memo[x] = f(x) return memo[x] return f2 def parse(l): srules = re.compile(r"(?P\d+): (?P\d+)\n").findall(l) rules = re.compile(r"(?P\d+): (?P\d+) (?P\d+)\n").findall(l) wrules = re.compile(r"(?P\d+): \"(?P\w)\"\n").findall(l) crules = re.compile(r"(?P\d+): (?P\d+) (?P\d+) \| (?P\d+) (?P\d+)\n").findall(l) csrules = re.compile(r"(?P\d+): (?P\d+) \| (?P\d+)\n").findall(l) messages = re.compile(r"(?P\w+)\n").findall(l) return rules, wrules, crules, srules, csrules, messages def check_if_valid(message): return 0 @memo def build_regex(rule): if dict[rule] == 'a' or dict[rule] == 'b': return dict[rule] if type(dict[rule]) == int: return build_regex(dict[rule]) s = "(" for i, r in enumerate(dict[rule]): if i == 2: s += ")|(" s += build_regex(r) return s + ")" with open(r"C:\Users\Maya\Desktop\Uni\WS_2021\AoC\input19") as f: lines = f.readlines() lines = "".join(lines) r, w, c, s, messages = parse(lines) rules = r + w + c + s dict = {} for rule in rules: if len(rule) == 2: try: dict[int(rule[0])] = int(rule[1]) except ValueError: dict[int(rule[0])] = rule[1] if len(rule) == 3: dict[int(rule[0])] = int(rule[1]), int(rule[2]) if len(rule) == 5: dict[int(rule[0])] = int(rule[1]), int(rule[2]), int(rule[3]), int(rule[4]) print(dict) print(build_regex(0)) print(sum([check_if_valid(m) for m in messages]))