Files
adventofcode/2019/aoc2019/day23.py

79 lines
2.0 KiB
Python

from typing import TextIO
from aoc2019.intcode import read_program, Computer
def part1(data: TextIO) -> int:
program = read_program(data)
computers = [Computer(program.copy()) for _ in range(50)]
for i, computer in enumerate(computers):
computer.send_input(i)
while True:
for computer in computers:
try:
computer.run()
except IndexError:
computer.send_input(-1)
while len(computer.output) >= 3:
dest = computer.get_output()
x = computer.get_output()
y = computer.get_output()
if dest == 255:
return y
computers[dest].send_input(x)
computers[dest].send_input(y)
def part2(data: TextIO) -> int:
program = read_program(data)
computers = [Computer(program.copy()) for _ in range(50)]
for i, computer in enumerate(computers):
computer.send_input(i)
nat_value = None
last_sent = None
while True:
is_idle = True
for computer in computers:
try:
computer.execute_current()
is_idle = False
except IndexError:
computer.send_input(-1)
try:
computer.run()
except IndexError:
pass
while len(computer.output) >= 3:
dest = computer.get_output()
x = computer.get_output()
y = computer.get_output()
if dest == 255:
nat_value = (x, y)
else:
computers[dest].send_input(x)
computers[dest].send_input(y)
if is_idle:
x, y = nat_value
if last_sent == nat_value:
return y
else:
computers[0].send_input(x)
computers[0].send_input(y)
last_sent = nat_value