Files
adventofcode/2015/day-07/solution.py
2016-12-01 11:25:19 +01:00

67 lines
1.6 KiB
Python

from __future__ import print_function
import fileinput
import re
import sys
recipe = {}
values = {}
def findValue(node):
match = re.search(r"\d+", node)
if match:
return int(match.group(0))
if node in values:
return values[node]
if node not in recipe:
sys.exit("Node without recipe '" + node + "'")
valueA = None
valueB = None
if recipe[node][0]:
valueA = findValue(recipe[node][0].strip())
if recipe[node][2]:
valueB = findValue(recipe[node][2])
action = recipe[node][1]
value = None
if action == "RSHIFT":
value = valueA >> valueB
elif action == "LSHIFT":
value = (valueA << valueB) & 0xffff
elif action == "NOT":
value = (~valueB) & 0xffff
elif action == "IS":
value = valueA & 0xffff
elif action == "AND":
value = valueA & valueB
elif action == "OR":
value = valueA | valueB
else:
sys.exit("Unsupported command " + action)
values[node] = value
return value
opPattern = re.compile(r"(\w+ )?(RSHIFT|LSHIFT|NOT|AND|OR) (\w+) -> (\w+)")
valuePattern = re.compile(r"(\w+) -> (\w+)")
for line in fileinput.input():
match = valuePattern.match(line)
if match:
recipe[match.group(2)] = (match.group(1), "IS", "")
else:
match = opPattern.match(line)
if match.group(4) in recipe:
sys.exit("Node with multiple recipes")
recipe[match.group(4)] = (match.group(1), match.group(2), match.group(3))
a = findValue("a")
print("Initial a is ", a)
values = {}
values["b"] = a
print("Secondary a is", findValue("a"))