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)