0
0
Fork 0
AdventOfCode/day_7/part_1.py
2020-12-06 20:33:17 -07:00

81 lines
No EOL
1.8 KiB
Python

from random import randint
target_key = "a"
values = {}
tests = [
"123 -> x",
"456 -> y",
"x AND y -> d",
"x OR y -> e",
"x LSHIFT 2 -> f",
"y RSHIFT 2 -> g",
"NOT x -> h",
"NOT y -> i"
]
def get_operation(instr):
if len(instr) == 3: return "ASSIGNMENT"
elif len(instr) == 4: return "INVERT"
else: return instr[1]
def convert_values(op_type, instr):
def to_int(key):
"""
Helper function to convert a single value in an instruction to an int
"""
try:
return int(key)
except ValueError:
try:
return values[key]
except KeyError:
return None
if op_type == "INVERT":
instr[1] = to_int(instr[1])
elif op_type == "ASSIGNMENT":
instr[0] = to_int(instr[0])
else:
instr[0] = to_int(instr[0])
instr[2] = to_int(instr[2])
return instr
def execute_operation(op_type, instr):
target = instr[-1]
if op_type == "ASSIGNMENT": values[target] = instr[0]
elif op_type == "INVERT": values[target] = ~instr[1] + 2**16
elif op_type == "OR": values[target] = instr[0] | instr[2]
elif op_type == "AND": values[target] = instr[0] & instr[2]
elif op_type == "LSHIFT": values[target] = instr[0] << instr[2]
elif op_type == "RSHIFT": values[target] = instr[0] >> instr[2]
else: raise Exception(f"Input Error: Invalid Operation Type: {op_type}")
def run_instruction(instr):
instr = instr.split(" ")
op_type = get_operation(instr)
instr = convert_values(op_type, instr)
# Ensure all operation parameters were found correctly
if None in instr: return False
execute_operation(op_type, instr)
return True
with open("input", "r") as data:
lines = data.readlines()
while "a" not in values:
random_index = randint(0, len(lines) - 1)
success = run_instruction(lines[random_index].strip())
if success:
del lines[random_index]
print(f"Value of A: {values['a']}")