107 lines
2.6 KiB
Python
107 lines
2.6 KiB
Python
from lib import get_data
|
|
|
|
|
|
def eval_1(s) -> int:
|
|
if type(s) is int:
|
|
return s
|
|
i = 0
|
|
parts = []
|
|
while i < len(s):
|
|
if s[i] == "(":
|
|
nested = 1
|
|
r = "("
|
|
i += 1
|
|
while nested > 0:
|
|
r += s[i]
|
|
if s[i] == ")":
|
|
nested -= 1
|
|
elif s[i] == "(":
|
|
nested += 1
|
|
i += 1
|
|
parts.append(r[1:-1])
|
|
elif s[i].isdigit():
|
|
d = ""
|
|
while i < len(s) and s[i].isdigit():
|
|
d += s[i]
|
|
i += 1
|
|
parts.append(int(d))
|
|
elif s[i] == " ":
|
|
pass
|
|
elif s[i] == "*" or s[i] == "+":
|
|
parts.append(s[i])
|
|
i += 1
|
|
|
|
i = 0
|
|
while len(parts) > 1:
|
|
if parts[1] == "*":
|
|
parts[2] = eval_1(parts[0]) * eval_1(parts[2])
|
|
parts = parts[2:]
|
|
elif parts[1] == "+":
|
|
parts[2] = eval_1(parts[0]) + eval_1(parts[2])
|
|
parts = parts[2:]
|
|
else:
|
|
assert False
|
|
return parts[-1]
|
|
|
|
|
|
def eval_2(s) -> int:
|
|
if type(s) is int:
|
|
return s
|
|
i = 0
|
|
parts = []
|
|
while i < len(s):
|
|
if s[i] == "(":
|
|
nested = 1
|
|
r = "("
|
|
i += 1
|
|
while nested > 0:
|
|
r += s[i]
|
|
if s[i] == ")":
|
|
nested -= 1
|
|
elif s[i] == "(":
|
|
nested += 1
|
|
i += 1
|
|
parts.append(r[1:-1])
|
|
elif s[i].isdigit():
|
|
d = ""
|
|
while i < len(s) and s[i].isdigit():
|
|
d += s[i]
|
|
i += 1
|
|
parts.append(int(d))
|
|
elif s[i] == " ":
|
|
pass
|
|
elif s[i] == "*" or s[i] == "+":
|
|
parts.append(s[i])
|
|
i += 1
|
|
|
|
while len(parts) > 1:
|
|
new_parts = []
|
|
for i in range(0, len(parts) - 1, 2):
|
|
if parts[i + 1] == "+":
|
|
new_parts.append(eval_2(parts[i]) + eval_2(parts[i + 2]))
|
|
new_parts += parts[i + 3 :]
|
|
break
|
|
elif parts[1] == "*":
|
|
new_parts.append(parts[i])
|
|
new_parts.append(parts[i + 1])
|
|
else:
|
|
assert False
|
|
else:
|
|
assert parts[1] == "*"
|
|
new_parts = [eval_2(parts[0]) * eval_2(parts[2])]
|
|
new_parts += parts[3:]
|
|
parts = new_parts
|
|
return parts[-1]
|
|
|
|
|
|
data = get_data(__file__)
|
|
|
|
t1, t2 = 0, 0
|
|
for line in data.splitlines():
|
|
t1 += eval_1(line)
|
|
t2 += eval_2(line)
|
|
|
|
print(t1)
|
|
print(t2)
|
|
assert t2 == 290726428573651
|