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