Spaces:
Running
Running
File size: 1,968 Bytes
a4da721 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
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 |