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