summaryrefslogtreecommitdiffstats
path: root/20/py/d19.py
blob: 7317c4447c1fe37782781d82faf5eb39172e4744 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import aoc20
import sys
from collections import defaultdict
import functools
import re


def pt1(_in):
    rules = dict()
    for rule in "".join(_in).split("\n\n")[0].split("\n"):
        rule = rule.replace("\"", "").split(": ")
        rules[rule[0]] = rule[1] if rule[1] in "ab" else "( {} )".format(rule[1])

    @functools.cache
    def format_rule(rule):
        if rule not in rules:
            return rule
        return " ".join(format_rule(token) for token in rules[rule].split())

    regex = re.compile(format_rule("0").replace(" ", ""))
    return sum(1 for line in "".join(_in).split("\n\n")[1][:-1].split("\n") if regex.fullmatch(line))


def pt2(_in):
    pass


if __name__ == "__main__":
    _in = aoc20.read_input(sys.argv[1:], 19)
    print(pt1(_in))
    print(pt2(_in))