80 lines
1.8 KiB
Python
80 lines
1.8 KiB
Python
from functools import reduce
|
|
|
|
formulas = []
|
|
|
|
with open('day18/input') as reader:
|
|
formulas.extend(reader.read().splitlines())
|
|
|
|
|
|
def calculate_part1(cur_formula):
|
|
res = None
|
|
op = None
|
|
while cur_formula:
|
|
v = None
|
|
c = cur_formula.pop(0)
|
|
if c == '(':
|
|
v = calculate_part1(cur_formula)
|
|
elif c == ')':
|
|
return res
|
|
elif c == '*' or c == '+':
|
|
op = c
|
|
continue
|
|
else:
|
|
v = int(c)
|
|
|
|
if res is None:
|
|
res = v
|
|
else:
|
|
if op == '*':
|
|
res *= v
|
|
elif op == '+':
|
|
res += v
|
|
else:
|
|
raise ArithmeticError
|
|
return res
|
|
|
|
|
|
def calculate_part2(cur_formula):
|
|
res = None
|
|
op = None
|
|
mul_stack = []
|
|
while cur_formula:
|
|
v = None
|
|
c = cur_formula.pop(0)
|
|
if c == '(':
|
|
v = calculate_part2(cur_formula)
|
|
elif c == ')':
|
|
mul_stack.append(res)
|
|
res = reduce((lambda x, y: x * y), mul_stack)
|
|
return res
|
|
elif c == '+':
|
|
op = c
|
|
continue
|
|
elif c == '*':
|
|
op = c
|
|
mul_stack.append(res)
|
|
res = None
|
|
continue
|
|
else:
|
|
v = int(c)
|
|
|
|
if res is None:
|
|
res = v
|
|
else:
|
|
if op == '*':
|
|
raise ArithmeticError
|
|
elif op == '+':
|
|
res += v
|
|
else:
|
|
raise ArithmeticError
|
|
mul_stack.append(res)
|
|
res = reduce((lambda x, y: x * y), mul_stack)
|
|
return res
|
|
|
|
|
|
total_sum_part1 = sum(map(calculate_part1, map(lambda f: [c for c in f if c != ' '], formulas)))
|
|
print(total_sum_part1)
|
|
|
|
total_sum_part2 = sum(map(calculate_part2, map(lambda f: [c for c in f if c != ' '], formulas)))
|
|
print(total_sum_part2)
|