parent
04beea00a3
commit
294b72cb9d
@ -0,0 +1,262 @@ |
||||
#!/usr/bin/env python |
||||
|
||||
from aoc import get_input # AoC |
||||
import re # regex |
||||
|
||||
mathproblems = get_input(18).splitlines() |
||||
|
||||
operators = ["+", "*"] |
||||
|
||||
def strToList(string): |
||||
list1=[] |
||||
list1[:0]=string |
||||
return list1 |
||||
|
||||
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 getFirstNum(chars:list): |
||||
first = None |
||||
|
||||
for i in range(len(chars)): |
||||
char = chars[i] |
||||
print(f"check {char=}", end=" ") |
||||
if(not char in operators and char != "(" and char != ")" and char != ""): |
||||
first = int(char) |
||||
print("is first") |
||||
|
||||
break |
||||
else: |
||||
print("") |
||||
|
||||
return first |
||||
|
||||
|
||||
def calcMath(chars:list): |
||||
count = 0 |
||||
first = getFirstNum(chars) |
||||
count += first |
||||
|
||||
for i in range(len(chars)): |
||||
char = chars[i] |
||||
|
||||
after = None |
||||
|
||||
if(char == "+"): |
||||
after = chars[i+1] |
||||
count += int(after) |
||||
elif(char == "*"): |
||||
after = chars[i+1] |
||||
count *= int(after) |
||||
|
||||
print(f"{first=} {char=} {i=} {after=} {count=}") |
||||
|
||||
return count |
||||
|
||||
def parseMath(line): |
||||
line = line.replace(" ", "") |
||||
count = 0 |
||||
|
||||
# calculate all pars and replace them |
||||
pars = findParens(line) |
||||
chars = strToList(line) |
||||
print(chars) |
||||
|
||||
for start, end in pars.items(): |
||||
calc = calcMath(chars[start:end+1]) |
||||
|
||||
for j in range(start, end+1): |
||||
chars[j] = "" |
||||
|
||||
chars[start] = str(calc) |
||||
|
||||
|
||||
print("##########3") |
||||
# remove bad chars |
||||
chars = list( filter(lambda c: c != "", chars) ) |
||||
print(chars) |
||||
|
||||
|
||||
# calculate the rest |
||||
count += calcMath(chars) |
||||
|
||||
return count |
||||
|
||||
def printMath(mathlist): |
||||
for m in mathlist: |
||||
print(m, end="") |
||||
print("") |
||||
|
||||
def lstToStr(lst): |
||||
out = "" |
||||
for char in lst: |
||||
out += str(char) |
||||
return out |
||||
|
||||
def copyList(lst): |
||||
return [elem for elem in lst] |
||||
|
||||
# def addPars(line:str): |
||||
# chars = strToList(line) |
||||
# plusCount = chars.count("+") |
||||
|
||||
# seekingEnd = None |
||||
# parsPos = dict() |
||||
|
||||
# print("#", line) |
||||
# for i in range(len(chars)): |
||||
# char = chars[i] |
||||
|
||||
# if(char == "+"): |
||||
# parsPos[i-1] = None |
||||
# seekingEnd = i-1 |
||||
|
||||
# if( (char == "*" and seekingEnd != None) ): |
||||
# parsPos[seekingEnd] = i |
||||
# seekingEnd = None |
||||
|
||||
# if( seekingEnd != None and i >= len(chars) - 1 ): |
||||
# parsPos[seekingEnd] = i+1 |
||||
# seekingEnd = None |
||||
|
||||
# if( seekingEnd != None and char == ")" ): |
||||
# parsPos[seekingEnd] = i+1 |
||||
# seekingEnd = None |
||||
|
||||
# print(f"{i=}:{char=} {parsPos=}") |
||||
|
||||
# offset = 0 |
||||
# needEnd = 0 |
||||
# for pstart, pend in parsPos.items(): |
||||
# print("#", pstart, pend) |
||||
|
||||
# if(pend != None): |
||||
# chars.insert(pstart+offset, "(") |
||||
# offset += 1 |
||||
|
||||
# chars.insert(pend+offset, ")") |
||||
# offset += 1 |
||||
# else: |
||||
# chars.insert(pstart+offset, 0) |
||||
# offset += 1 |
||||
# printMath(chars) |
||||
|
||||
# chars.insert(pstart+offset, "+") |
||||
# offset += 1 |
||||
# printMath(chars) |
||||
|
||||
# chars.insert(pstart+offset-2, "(") |
||||
# offset += 1 |
||||
# printMath(chars) |
||||
|
||||
# needEnd += 1 |
||||
|
||||
# for i in range(needEnd): |
||||
# chars.append(")") |
||||
|
||||
# print("RES", end=" ") |
||||
# printMath(chars) |
||||
|
||||
# return chars |
||||
|
||||
# import ast |
||||
|
||||
# def recurse(node): |
||||
# out = "" |
||||
# if( isinstance(node, ast.Add) ): |
||||
|
||||
|
||||
# def addPars(line:str): |
||||
# out = strToList(line) |
||||
|
||||
# offset = 0 |
||||
# parDepth = 0 |
||||
# seekingClose = False |
||||
|
||||
# startFound = None |
||||
# endFound = None |
||||
|
||||
# for i in range(len(line)): |
||||
# char = line[i] |
||||
# prefix = "-----" |
||||
|
||||
# if( char == "+" and not seekingClose ): |
||||
# out.insert(i - 1 + offset, "(" ) |
||||
# seekingClose = True |
||||
# startFound = i-1+offset |
||||
# offset += 1 |
||||
|
||||
|
||||
# prefix = "start" |
||||
|
||||
# elif( char == "(" ): |
||||
# parDepth += 1 |
||||
# elif( char == ")" ): |
||||
# parDepth -= 1 |
||||
|
||||
# elif( (char == "*") and seekingClose and parDepth == 0 ): |
||||
# out.insert(i + offset, ")") |
||||
# offset += 1 |
||||
# seekingClose = False |
||||
# endFound = i+offset |
||||
|
||||
# prefix = "close" |
||||
|
||||
|
||||
|
||||
# math = lstToStr(out) |
||||
# print(f"{prefix} {i=}:{char=} {math=} {offset=}") |
||||
|
||||
# return out |
||||
|
||||
def addParsToSub(line:str): |
||||
# this function split the strings addition thing |
||||
# no parenthesis here |
||||
|
||||
addlines = line.split("*") # each element is an addition |
||||
newline = "" |
||||
|
||||
for i in range(len(addlines)): |
||||
l = addlines[i] |
||||
if( i < 1 ): |
||||
newline += f"({l})*" |
||||
elif( i >= 1 and i < len(addlines)-1 ): |
||||
newline += f"({l})*" |
||||
elif( i == len(addlines)-1 ): |
||||
newline += f"({l})" |
||||
|
||||
return newline |
||||
|
||||
|
||||
def parseMath2(line): |
||||
line = line.replace(" ", "") |
||||
count = 0 |
||||
|
||||
|
||||
|
||||
|
||||
problem = mathproblems[0] |
||||
res = parseMath2(problem) |
||||
print("\n--##########################--") |
||||
print( problem, "=", res ) |
||||
|
||||
# mathsum = 0 |
||||
|
||||
# for maththing in mathproblems: |
||||
# mathsum += parseMath(maththing) |
||||
|
||||
# print(mathsum) |
Loading…
Reference in new issue