/ Python / 2015 / 07.py
07.py
 1  from lib import *
 2  
 3  input = read_input(2015, 7)
 4  
 5  MOD = 1 << 16
 6  
 7  
 8  funcs = {dest: args for *args, _, dest in map(str.split, input.splitlines())}
 9  
10  dp = {}
11  
12  
13  def solve(key):
14      if key not in dp:
15          if key.isnumeric():
16              val = int(key)
17  
18          else:
19              args = funcs[key]
20  
21              if len(args) == 1:
22                  val = solve(args[0])
23  
24              elif len(args) == 2:
25                  if args[0] == "NOT":
26                      val = ~solve(args[1]) % MOD
27  
28              elif len(args) == 3:
29                  if args[1] == "OR":
30                      val = solve(args[0]) | solve(args[2])
31  
32                  elif args[1] == "AND":
33                      val = solve(args[0]) & solve(args[2])
34  
35                  elif args[1] == "LSHIFT":
36                      val = solve(args[0]) << solve(args[2])
37  
38                  elif args[1] == "RSHIFT":
39                      val = solve(args[0]) >> solve(args[2])
40  
41          dp[key] = val % MOD
42  
43      return dp[key]
44  
45  
46  print(solve("a"))
47  
48  dp.clear()
49  dp = {"b": solve("a")}
50  print(solve("a"))