Example #1
0
def main():
    program = load_input("d17.txt")
    grid = Grid.build(program)

    junctions = grid.get_junctions()
    p1 = sum(j[0] * j[1] for j in junctions)
    print(f"Part 1: {p1}")

    routine, functions = grid.get_dust_routine()

    def encode(data):
        x = [ord(c) for c in list(data)] + [10]
        if len(x) > 20:
            raise ValueError(data)

        return x

    def encode_fn(data):
        fn = []
        elements = data.split(",")
        for e in elements:
            fn.append(e[0])
            fn.append(str(e[1:]))

        return encode(",".join(fn))

    cpu = IntCodeCPU(program)
    cpu.poke(0, 2)
    cpu.run(encode(routine))
    for f in functions:
        cpu.run(encode_fn(f[1]))

    cpu.run(encode("n"))

    print(f"Part 2: {cpu.pop_output()[-1]}")
Example #2
0
def play(program, coins=2, render=False):
    if render:
        print("\033[2J")

    cpu = IntCodeCPU(program)
    cpu.poke(0, coins)

    interrupt = cpu.run()
    if interrupt != InterruptCode.WAITING_ON_INPUT:
        raise ValueError(f"Unexpected program state: Interrupt = {interrupt}")

    gs = GameState.init(cpu.pop_output())

    while True:
        delta = gs.ball_x - gs.paddle_x
        if delta > 0:
            in_ = (1, )
        elif delta < 0:
            in_ = (-1, )
        else:
            in_ = (0, )

        res = cpu.run(in_)
        gs.update(cpu.pop_output())

        if render:
            gs.render()
            sleep(0.015)

        if res is None:
            break

    return gs.score