Spaces:
Running
Running
def parse_input(filename): | |
with open(filename, "r") as f: | |
lines = f.readlines() | |
registers = {} | |
for line in lines: | |
if line.startswith("Register"): | |
reg, val = line.split(":") | |
registers[reg.split()[1]] = int(val.strip()) | |
elif line.startswith("Program"): | |
program = list(map(int, line.split(":")[1].strip().split(","))) | |
return registers, program | |
def run_program(registers, program): | |
output = [] | |
ip = 0 | |
while 0 <= ip < len(program): | |
opcode = program[ip] | |
operand = program[ip + 1] | |
if opcode == 0: # adv | |
denominator = 2 ** (operand if operand < 4 else registers["ABC"[operand - 4]]) | |
registers["A"] //= denominator | |
elif opcode == 1: # bxl | |
registers["B"] ^= operand | |
elif opcode == 2: # bst | |
registers["B"] = operand % 8 | |
elif opcode == 3: # jnz | |
if registers["A"] != 0: | |
ip = operand | |
continue | |
elif opcode == 4: # bxc | |
registers["B"] ^= registers["C"] | |
elif opcode == 5: # out | |
val = (operand if operand < 4 else registers["ABC"[operand - 4]]) % 8 | |
output.append(str(val)) | |
elif opcode == 6: # bdv | |
denominator = 2 ** (operand if operand < 4 else registers["ABC"[operand - 4]]) | |
registers["B"] //= denominator | |
elif opcode == 7: # cdv | |
denominator = 2 ** (operand if operand < 4 else registers["ABC"[operand - 4]]) | |
registers["C"] //= denominator | |
ip += 2 | |
return ",".join(output) | |
registers, program = parse_input("./input.txt") | |
print(run_program(registers.copy(), program)) | |
for a in range(1, 1000000): # Adjust range if needed | |
registers["A"] = a | |
registers["B"] = 0 | |
registers["C"] = 0 | |
output = run_program(registers.copy(), program) | |
if output == ",".join(map(str, program)): | |
print(a) | |
break |