Sean McLemon | Advent of Code

Home | Czech | Blog | GitHub | Advent Of Code | Notes


2016-12-10 - Balance Bots

(original .ipynb)
from collections import defaultdict

puzzle_input_str = open("puzzle_input/day10.txt").read()


def parse_initial_value(line, values):
    val_str, dest = line.removeprefix("value ").split(" goes to ")
    val = int(val_str)
    values[dest].append(val)

    
def parse_instruction(line, instructions):
    src, destinations = line.split(" gives ")
    low, high = destinations.split(" and ")
    instructions[src] = (
        low.removeprefix("low to "), 
        high.removeprefix("high to ")
    )

    
def parse_input(input_str):
    values = defaultdict(list)
    instructions = defaultdict(list)
    
    for line in input_str.split("\n"):
        if line.startswith("value"):
            parse_initial_value(line, values)
        else:
            parse_instruction(line, instructions)
    
    return values, instructions


def is_output(dest):
    return dest.startswith("output")


def next_bot(values):
    for bot in values:
        if is_output(bot):
            continue
        if len(values[bot]) == 2:
            return bot
    
    return None


def solve(input_str):
    values, instructions = parse_input(input_str)
    bot = next_bot(values)
    p1 = None
    
    while not(bot is None):
        low_dest, high_dest = instructions[bot]
        low, high = sorted(values[bot])
        
        if low == 17 and high == 61:
            p1 = bot.removeprefix("bot ")
        
        values[low_dest].append(low)
        values[high_dest].append(high)
        values[bot] = []
        bot = next_bot(values)
    
    p2 = values["output 0"][0] * values["output 1"][0] * values["output 2"][0]
    
    return p1, p2


part_one, part_two = solve(puzzle_input_str)

print("part one:", part_one)
print("part two:", part_two)
part one: 98
part two: 4042