advent24-llm / day17 /solution_gpt-4o.py
jerpint's picture
Add solution files
a4da721
raw
history blame
2.26 kB
def parse_input(file):
with open(file, 'r') as f:
lines = f.readlines()
initial_values = [int(line.split(': ')[1]) for line in lines[:3]]
program = list(map(int, lines[3].split(': ')[1].split(',')))
return initial_values, program
def get_combo_value(operand, registers):
if operand <= 3:
return operand
elif operand == 4:
return registers['A']
elif operand == 5:
return registers['B']
elif operand == 6:
return registers['C']
else:
raise ValueError("Invalid combo operand")
def execute_program(registers, program):
output = []
ip = 0
while ip < len(program):
opcode = program[ip]
operand = program[ip + 1]
if opcode == 0: # adv
denominator = 2 ** get_combo_value(operand, registers)
registers['A'] //= denominator
elif opcode == 1: # bxl
registers['B'] ^= operand
elif opcode == 2: # bst
registers['B'] = get_combo_value(operand, registers) % 8
elif opcode == 3: # jnz
if registers['A'] != 0:
ip = operand
continue
elif opcode == 4: # bxc
registers['B'] ^= registers['C']
elif opcode == 5: # out
output.append(get_combo_value(operand, registers) % 8)
elif opcode == 6: # bdv
denominator = 2 ** get_combo_value(operand, registers)
registers['B'] = registers['A'] // denominator
elif opcode == 7: # cdv
denominator = 2 ** get_combo_value(operand, registers)
registers['C'] = registers['A'] // denominator
ip += 2
return output
def part1(file):
initial_values, program = parse_input(file)
registers = {'A': initial_values[0], 'B': initial_values[1], 'C': initial_values[2]}
output = execute_program(registers, program)
return ','.join(map(str, output))
def part2(file):
_, program = parse_input(file)
for a in range(1, 1000000): # Arbitrary large number for search
registers = {'A': a, 'B': 0, 'C': 0}
output = execute_program(registers, program)
if output == program:
return a
file = "input.txt"
print(part1(file))
print(part2(file))