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"))