master
parent
b31e465659
commit
4fa839bff3
@ -0,0 +1,91 @@ |
||||
#!/usr/bin/env python |
||||
|
||||
from aoc import get_input # AoC |
||||
import regex |
||||
import re |
||||
|
||||
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('"', "") |
||||
|
||||
def containsPointers(rule): # function to check if a rule contains a pointer |
||||
cont = rulePrim[rule] |
||||
|
||||
contains = False |
||||
for char in cont: |
||||
if(char.isnumeric()): |
||||
contains = True |
||||
break |
||||
|
||||
return contains |
||||
|
||||
for rule, cont in rulePrim.items(): # replace everything with the chars instead of pointers |
||||
check = containsPointers(rule) |
||||
|
||||
while(check): |
||||
for i in range(len(rulePrim[rule])): |
||||
char = rulePrim[rule][i] |
||||
|
||||
if(char == " "): |
||||
continue |
||||
|
||||
if(char.isnumeric()): |
||||
v = int(char) |
||||
pointsTo = rulePrim[v] |
||||
repl = f"{rulePrim[v]}" |
||||
|
||||
if(len(pointsTo) > 1): |
||||
repl = f"({rulePrim[v]})" |
||||
|
||||
rulePrim[rule] = rulePrim[rule].replace(char, repl) |
||||
|
||||
check = containsPointers(rule) |
||||
|
||||
#rulePrim[rule] = rulePrim[rule].replace(" ", "") |
||||
|
||||
|
||||
def findParens(s): |
||||
toret = dict() |
||||
pstack = [] |
||||
|
||||
for i, c in enumerate(s): |
||||
if( c == "(" ): |
||||
pstack.append(i) |
||||
elif( c == ")" ): |
||||
if( len(pstack) == 0 ): |
||||
raise IndexError("No matching closing parens at: " + str(i)) |
||||
toret[pstack.pop()] = i |
||||
|
||||
if(len(pstack) > 0): |
||||
raise IndexError("No matching opening parens at: " + str(pstack.pop())) |
||||
|
||||
return toret |
||||
|
||||
def getHighestParen(parens): |
||||
bestkey = None |
||||
bestdiff = None |
||||
|
||||
for k, v in parens.items(): |
||||
diff = v - k |
||||
if(bestdiff == None): |
||||
bestdiff = diff |
||||
bestkey = k |
||||
continue |
||||
|
||||
if(diff > bestdiff): |
||||
bestdiff = diff |
||||
bestkey = k |
||||
|
||||
return bestkey |
||||
|
||||
|
||||
for rule, val in rulePrim.items(): |
Loading…
Reference in new issue