Files
adventofcode/day-07/solution.py
2015-12-09 11:20:40 +01:00

66 lines
1.6 KiB
Python

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