Day 10 - Advent of Code 2016

Working solution for the day 10 puzzles.

Parts One and Two

""" day_10_01_02.py """

# usage: python3 day_10_01_02.py 17 61 < input

from collections import defaultdict
import sys

target = int(sys.argv[1]), int(sys.argv[2])

data = defaultdict(list)
rules = {}

while True:
    try:
        line = input()
        tokens = line.split()
        if tokens[0] == 'value':
            bot = int(tokens[5])
            data[('bot', bot)].append(int(tokens[1]))
        elif tokens[0] == 'bot':
            rules[int(tokens[1])] = (tokens[5], int(tokens[6]),
                                     tokens[10], int(tokens[11]))
    except EOFError:
        break

while any(len(chips) > 1 for (i, j), chips in data.items() if i == 'bot'):
    for (i, bot) in list(data):
        if i == 'bot' and len(data[(i, bot)]) > 1:
            data[(i, bot)].sort()
            low = data[(i, bot)].pop(0)
            high = data[(i, bot)].pop()
            if (low, high) == target:
                print(f'part 1 - {bot}')
            data[(rules[bot][0], rules[bot][1])].append(low)
            data[(rules[bot][2], rules[bot][3])].append(high)

ans = data[('output', 0)][0] * data[('output', 1)][0] * data[('output', 2)][0]
print(f'part 2 - {ans}')