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