|
|
|
@ -1,4 +1,4 @@ |
|
|
|
from typing import List, Tuple, Any |
|
|
|
from typing import List, Tuple, Iterator |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class OpcodeComputer(): |
|
|
|
class OpcodeComputer(): |
|
|
|
@ -14,6 +14,7 @@ class OpcodeComputer(): |
|
|
|
https://adventofcode.com/2019/day/5 |
|
|
|
https://adventofcode.com/2019/day/5 |
|
|
|
|
|
|
|
|
|
|
|
""" |
|
|
|
""" |
|
|
|
|
|
|
|
__last_result: int = 0 |
|
|
|
memory = [] |
|
|
|
memory = [] |
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, mem: List[int]) -> None: |
|
|
|
def __init__(self, mem: List[int]) -> None: |
|
|
|
@ -42,7 +43,8 @@ class OpcodeComputer(): |
|
|
|
pass |
|
|
|
pass |
|
|
|
return (int(i[-2:]), a, b, c) |
|
|
|
return (int(i[-2:]), a, b, c) |
|
|
|
|
|
|
|
|
|
|
|
def process_op(self, inp: List[int] = [], outp: List[Any] = []) -> int: |
|
|
|
def process_op(self, inp: List[int] = [])\ |
|
|
|
|
|
|
|
-> Iterator[str]: |
|
|
|
"""Run program code |
|
|
|
"""Run program code |
|
|
|
|
|
|
|
|
|
|
|
Args: |
|
|
|
Args: |
|
|
|
@ -67,7 +69,7 @@ class OpcodeComputer(): |
|
|
|
mem[mem[pc+1]] = int(inp.pop(0)) |
|
|
|
mem[mem[pc+1]] = int(inp.pop(0)) |
|
|
|
pc += 2 |
|
|
|
pc += 2 |
|
|
|
elif cmd == 4: |
|
|
|
elif cmd == 4: |
|
|
|
outp.append(str(a)) |
|
|
|
yield str(a) |
|
|
|
pc += 2 |
|
|
|
pc += 2 |
|
|
|
elif cmd == 5: |
|
|
|
elif cmd == 5: |
|
|
|
pc = b if a != 0 else pc + 3 |
|
|
|
pc = b if a != 0 else pc + 3 |
|
|
|
@ -80,4 +82,8 @@ class OpcodeComputer(): |
|
|
|
mem[mem[pc+3]] = 1 if a == b else 0 |
|
|
|
mem[mem[pc+3]] = 1 if a == b else 0 |
|
|
|
pc += 4 |
|
|
|
pc += 4 |
|
|
|
cmd = mem[pc] |
|
|
|
cmd = mem[pc] |
|
|
|
return mem[0] |
|
|
|
self.__last_result = mem[0] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def process_all(self) -> int: |
|
|
|
|
|
|
|
list(self.process_op()) |
|
|
|
|
|
|
|
return self.__last_result |
|
|
|
|