You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.7 KiB
60 lines
1.7 KiB
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<rule>\d+): (?P<num1>\d+)\n").findall(l)
|
|
rules = re.compile(r"(?P<rule>\d+): (?P<num1>\d+) (?P<num2>\d+)\n").findall(l)
|
|
wrules = re.compile(r"(?P<rule>\d+): \"(?P<body>\w)\"\n").findall(l)
|
|
crules = re.compile(r"(?P<rule>\d+): (?P<num11>\d+) (?P<num12>\d+) \| (?P<num21>\d+) (?P<num22>\d+)\n").findall(l)
|
|
csrules = re.compile(r"(?P<rule>\d+): (?P<num11>\d+) \| (?P<num21>\d+)\n").findall(l)
|
|
messages = re.compile(r"(?P<message>\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]))
|
|
|