Files
aoc-py/src/solution/year_2019/day_02.py

51 lines
1.3 KiB
Python

from typing import Any
class IntcodeComputer:
def __init__(self, program: list[int]):
self.memory = program.copy()
self.pointer = 0
def process_opcode(self) -> bool:
opcode = self.memory[self.pointer]
match opcode:
case 99:
return True
case 1:
p1, p2, p3 = self.memory[self.pointer + 1 : self.pointer + 4]
self.memory[p3] = self.memory[p1] + self.memory[p2]
case 2:
p1, p2, p3 = self.memory[self.pointer + 1 : self.pointer + 4]
self.memory[p3] = self.memory[p1] * self.memory[p2]
case e:
raise ValueError(f"unexpected opcode {e}")
self.pointer += 4
return False
def run_intcode_computer(program: list[int], noun: int, verb: int) -> int:
ic = IntcodeComputer(program)
ic.memory[1:3] = [noun, verb]
while True:
if ic.process_opcode():
break
return ic.memory[0]
def part_1(input_data: str) -> Any:
parsed = list(map(int, input_data.split(",")))
return run_intcode_computer(parsed, 12, 2)
def part_2(input_data: str) -> Any:
parsed = list(map(int, input_data.split(",")))
for n in range(100):
for v in range(100):
if run_intcode_computer(parsed, n, v) == 19690720:
return 100 * n + v