Skip to content

Instantly share code, notes, and snippets.

@rodrigogiraoserrao
Created December 22, 2024 21:15
Show Gist options
  • Save rodrigogiraoserrao/0a304db6db6c011f36021339cb4ab7e7 to your computer and use it in GitHub Desktop.
Save rodrigogiraoserrao/0a304db6db6c011f36021339cb4ab7e7 to your computer and use it in GitHub Desktop.
# === Parsing ===
with open("input.txt", "r") as f:
register_a = int(f.readline().split()[-1])
register_b = int(f.readline().split()[-1])
register_c = int(f.readline().split()[-1])
_ = f.readline()
program = [int(num) for num in f.readline().split()[-1].split(",")]
print(program, register_a, register_b, register_c)
# === Part 1 ===
from functools import partial
A, B, C = 4, 5, 6
registers = [0, 1, 2, 3, register_a, register_b, register_c]
output = []
operators = [
lambda o: registers[A] // pow(2, registers[o]),
lambda o: registers[B] ^ o,
lambda o: registers[o] % 8,
lambda o: ...,
lambda o: registers[B] ^ registers[C],
lambda o: registers[o] % 8,
lambda o: registers[A] // pow(2, registers[o]),
lambda o: registers[A] // pow(2, registers[o]),
]
state_updates = [
partial(registers.__setitem__, A),
partial(registers.__setitem__, B),
partial(registers.__setitem__, B),
lambda o: ...,
partial(registers.__setitem__, B),
output.append,
partial(registers.__setitem__, B),
partial(registers.__setitem__, C),
]
jumps = [
lambda ptr, o: ptr + 2,
lambda ptr, o: ptr + 2,
lambda ptr, o: ptr + 2,
lambda ptr, o: ptr + 2 if registers[A] == 0 else o,
lambda ptr, o: ptr + 2,
lambda ptr, o: ptr + 2,
lambda ptr, o: ptr + 2,
lambda ptr, o: ptr + 2,
]
ptr = 0
while ptr < len(program):
opcode = program[ptr]
operand = program[ptr + 1]
value = operators[opcode](operand)
state_updates[opcode](value)
ptr = jumps[opcode](ptr, operand)
print(output)
# === Part 2 ===
def b(a):
a_mod8 = a % 8
return (a_mod8 ^ (a // pow(2, a_mod8 ^ 7))) % 8
found = []
to_explore = [(0, 0)] # Pairs of A and number of matches made
while to_explore:
a_, matches_made = to_explore.pop()
if matches_made == len(program):
found.append(a_)
continue
target_b = program[-(matches_made + 1)]
for a in range(8 * a_, 8 * a_ + 8):
if b(a) == target_b:
to_explore.append((a, matches_made + 1))
print(sorted(found))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment