diff --git a/src/solution/year_2019/day_02.py b/src/solution/year_2019/day_02.py new file mode 100644 index 000000000..4274caf --- /dev/null +++ b/src/solution/year_2019/day_02.py @@ -0,0 +1,50 @@ +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