add remaining code and input files from 2020

This commit is contained in:
Cookie committed 2021-11-30 00:36:00 +01:00
1 parent c10382b0c0
commit 23b2e01280
41 files changed
+11320 -37

No files matched your search

+53 -37
View File
@@ -1,44 +1,60 @@
#!/usr/bin/env python3
import sys
import re
def parse_rules(lines):
rules = {}
for line in lines:
rule, pattern = line.split(':')
alternatives = pattern.split('|')
rules[int(rule)] = [a.strip(' ').split(' ') for a in alternatives]
return rules
def memo(f):
mem = {}
def helper(x):
if x not in mem: mem[x] = f(x)
return mem[x]
return helper
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 expr(rule):
if rule == 8:
return expr(42) + '+'
if rule == 11:
return '(?:' + expr(42) + '(?=a*(\1?+b)b*(\2?+c)))+\1' + expr(31) + ')'
global rules
if type(rule) is str:
try: rule = int(rule)
except ValueError: return rule[1]
pattern = rules[rule]
res = ["".join(expr(dep) for dep in alt) for alt in pattern]
if len(res) == 1: return res[0]
return "(" + "|".join(res) + ")"
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 + ")"
if __name__ == '__main__':
rules, messages = open(sys.argv[1]).read().split('\n\n')
rules = parse_rules(rules.split('\n'))
count = 0
messages = messages.split("\n")
for m in messages:
if bool(re.match('^' + expr(0) + '$', m)):
count += 1
print(count)
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]))