From 000000307f51f4422865d13e42a8e9f294eb7e4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Jane=C5=BEi=C4=8D?= Date: Mon, 1 Dec 2025 23:03:37 +0100 Subject: [PATCH] feat: add solution 2019/02 --- src/solution/year_2019/day_02.py | 50 ++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/solution/year_2019/day_02.py 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