71 lines
1.4 KiB
Python
71 lines
1.4 KiB
Python
from lib import *
|
|
|
|
input = read_input(2020, 18)
|
|
|
|
lines = input.splitlines()
|
|
|
|
|
|
def evaluate1(expr):
|
|
new_expr = ""
|
|
cnt = 0
|
|
buffer = ""
|
|
for c in expr.replace(" ", ""):
|
|
if c == "(":
|
|
if cnt:
|
|
buffer += c
|
|
cnt += 1
|
|
elif c == ")":
|
|
cnt -= 1
|
|
if cnt:
|
|
buffer += c
|
|
else:
|
|
new_expr += str(evaluate1(buffer))
|
|
buffer = ""
|
|
elif cnt:
|
|
buffer += c
|
|
else:
|
|
new_expr += c
|
|
|
|
out = 0
|
|
buffer = 0
|
|
op = False
|
|
for c in new_expr + " ":
|
|
if c.isnumeric():
|
|
buffer = buffer * 10 + int(c)
|
|
continue
|
|
if op:
|
|
out *= buffer
|
|
else:
|
|
out += buffer
|
|
buffer = 0
|
|
op = c == "*"
|
|
return out
|
|
|
|
|
|
print(sum(map(evaluate1, lines)))
|
|
|
|
|
|
def evaluate2(expr):
|
|
new_expr = ""
|
|
cnt = 0
|
|
buffer = ""
|
|
for c in expr.replace(" ", ""):
|
|
if c == "(":
|
|
if cnt:
|
|
buffer += c
|
|
cnt += 1
|
|
elif c == ")":
|
|
cnt -= 1
|
|
if cnt:
|
|
buffer += c
|
|
else:
|
|
new_expr += str(evaluate2(buffer))
|
|
buffer = ""
|
|
elif cnt:
|
|
buffer += c
|
|
else:
|
|
new_expr += c
|
|
return math.prod(sum(map(int, x.split("+"))) for x in new_expr.split("*"))
|
|
|
|
|
|
print(sum(map(evaluate2, lines)))
|