/ Python / 2020 / 18.py
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)))