diff --git a/2019/day23.py b/2019/day23.py new file mode 100644 index 0000000..1a4a3d6 --- /dev/null +++ b/2019/day23.py @@ -0,0 +1,55 @@ +from queue import Empty, SimpleQueue +from threading import Thread + +from intcode import Intcode + + +def main(): + codes = Intcode.parse_file("day23.txt") + network = Network(50, codes) + for nic in network.nics: + thread = Thread(target=lambda: nic.run(), name=f"NIC {nic.address}") + thread.start() + + +class Network: + + def __init__(self, size, codes): + self.nics = [NIC(address, self, codes) for address in range(size)] + + def route(self, sender, dest, x, y): + if dest == 255: + print(f"Packet to 255: {x, y}.") + return + print(f"Send {x, y} from {sender} to {dest}") + self.nics[dest].inq.put(x) + self.nics[dest].inq.put(y) + + +class NIC(Intcode): + + def __init__(self, address, network, *args, **kwargs): + super().__init__(*args, **kwargs) + self.address = address + self.network = network + self.inq = SimpleQueue() + self.inq.put(address) + self.outq = [] + + def input_data(self): + try: + data = self.inq.get(timeout=0.1) + except Empty: + data = -1 + return data + + def output_data(self, data): + self.outq.append(data) + if len(self.outq) == 3: + self.network.route(self.address, *self.outq) + self.outq = [] + return + + +if __name__ == "__main__": + main()