diff --git a/intcode.py b/intcode.py index 4ff0efb..10c25b3 100644 --- a/intcode.py +++ b/intcode.py @@ -1,6 +1,6 @@ import threading -import time -from collections import deque, defaultdict +from collections import defaultdict +from queue import Queue from enum import Enum from typing import List @@ -11,17 +11,11 @@ class IntCodeState(Enum): HALTED = 2 -def _get_from_queue(queue: deque, count: int = 1, timeout: int = 10) -> int | List[int] | None: - started = time.perf_counter() - while len(queue) < count: - time.sleep(0.0001) - if time.perf_counter() - started > timeout: - raise TimeoutError() - +def _get_from_queue(queue: Queue, count: int = 1, timeout: int = 10) -> int | List[int] | None: if count == 1: - return queue.popleft() + return queue.get(timeout=timeout) else: - return [queue.popleft() for _ in range(count)] + return [queue.get(timeout=timeout) for _ in range(count)] class IntCode(threading.Thread): @@ -31,8 +25,8 @@ class IntCode(threading.Thread): self.memory = defaultdict(int) for i, v in enumerate(memory): self.memory[i] = v - self.input_queue = deque() - self.output_queue = deque() + self.input_queue = Queue() + self.output_queue = Queue() self.state = IntCodeState.INITIALIZED self.relative_base = 0 @@ -62,14 +56,14 @@ class IntCode(threading.Thread): def isHalted(self): return self.state == IntCodeState.HALTED - def sendOutputTo(self, target_queue: deque): - self.output_queue = target_queue - def addInput(self, value: int): - self.input_queue.append(value) + self.input_queue.put(value) + + def addOutput(self, value: int): + self.output_queue.put(value) def hasOutput(self): - return len(self.output_queue) > 0 + return self.output_queue.qsize() > 0 def getOutput(self, count: int = 1, timeout: int = 10) -> int | List[int] | None: return _get_from_queue(self.output_queue, count, timeout) @@ -103,7 +97,7 @@ class IntCode(threading.Thread): self.setMemoryValue(target_addr, self.getInput()) self.instr_ptr += 2 elif op_code == 4: # output - self.output_queue.append(self.getParameterValue(self.instr_ptr + 1, p1_mode)) + self.addOutput(self.getParameterValue(self.instr_ptr + 1, p1_mode)) self.instr_ptr += 2 elif op_code == 5: # jump-if-true if self.getParameterValue(self.instr_ptr + 1, p1_mode) != 0: