feat: add solution 2019/02
This commit is contained in:
50
src/solution/year_2019/day_02.py
Normal file
50
src/solution/year_2019/day_02.py
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user