18.py
1 from lib import * 2 3 input = read_input(2020, 18) 4 5 lines = input.splitlines() 6 7 8 def evaluate1(expr): 9 new_expr = "" 10 cnt = 0 11 buffer = "" 12 for c in expr.replace(" ", ""): 13 if c == "(": 14 if cnt: 15 buffer += c 16 cnt += 1 17 elif c == ")": 18 cnt -= 1 19 if cnt: 20 buffer += c 21 else: 22 new_expr += str(evaluate1(buffer)) 23 buffer = "" 24 elif cnt: 25 buffer += c 26 else: 27 new_expr += c 28 29 out = 0 30 buffer = 0 31 op = False 32 for c in new_expr + " ": 33 if c.isnumeric(): 34 buffer = buffer * 10 + int(c) 35 continue 36 if op: 37 out *= buffer 38 else: 39 out += buffer 40 buffer = 0 41 op = c == "*" 42 return out 43 44 45 print(sum(map(evaluate1, lines))) 46 47 48 def evaluate2(expr): 49 new_expr = "" 50 cnt = 0 51 buffer = "" 52 for c in expr.replace(" ", ""): 53 if c == "(": 54 if cnt: 55 buffer += c 56 cnt += 1 57 elif c == ")": 58 cnt -= 1 59 if cnt: 60 buffer += c 61 else: 62 new_expr += str(evaluate2(buffer)) 63 buffer = "" 64 elif cnt: 65 buffer += c 66 else: 67 new_expr += c 68 return math.prod(sum(map(int, x.split("+"))) for x in new_expr.split("*")) 69 70 71 print(sum(map(evaluate2, lines)))