My solutions for Advent of Code.
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.
 
 
 
adventofcode/2020/19.py

98 lines
2.0 KiB

#!/usr/bin/env python
from aoc import get_input # AoC
import re
from functools import lru_cache
from copy import deepcopy as copy
data = get_input(19)
rules = data.split("\n\n")[0].split("\n")
messages = data.split("\n\n")[1].split("\n")
rulePrim = dict()
for i, rule in enumerate(rules): # make a dict for the rules
index, val = re.split(r": ", rule)
rulePrim[int(index)] = val.replace('"', "")
@lru_cache
def containsPointers(ruleStr): # function to check if a rule contains a pointer
return any(char.isnumeric() for char in ruleStr)
@lru_cache
def getPointersAtPos(string, starti=0):
thing = set(re.findall( r"\d+", string[starti:] ))
return thing
from sys import setrecursionlimit
setrecursionlimit(20000)
@lru_cache
def genRegex(rule, loop=False, i=0):
cont = rulePrim[rule]
cont = cont.split(" ")
reg = "("
for char in cont:
ispointer = char.isnumeric()
if( ispointer ):
if( i < 498 ):
reg += genRegex(int(char), loop, i+1)
else:
reg += "(\w+)"
else:
reg += char
reg += ")"
return reg
def removeSpaces(rule):
# remove spaces because they are evil
cont = rulePrim[rule]
rulePrim[rule] = cont.replace(" ", "")
rulePrim[rule] = "^" + rulePrim[rule] + "$"
return rulePrim[rule]
# go through all messages and check
def part1(rulePrim, messages):
count = 0
mesLen = len(messages)
for i, message in enumerate(messages):
check = re.match(rulePrim[0], message)
if(check):
count += 1
print(message)
print("Part1:", count)
rulePrim[8] = "42 | 42 8"
rulePrim[11] = "42 31 | 42 11 31"
rulePrim[8] = genRegex(8)
rulePrim[11] = genRegex(11)
# rulePrim[0] = genRegex(0)
# rulePrim[0] = removeSpaces(0)
# part1(rulePrim, messages)
# rulePrim[8] = "42 | 42 ([a-b]+)"
# rulePrim[11] = "42 31 | 42 ([a-b]+) 31"
rulePrim[0] = genRegex(0)
print("reg done")
rulePrim[0] = removeSpaces(0)
part1(rulePrim, messages)