81 lines
No EOL
1.8 KiB
Python
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']}") |