Sean McLemon | Advent of Code

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


2017-12-23 - Coprocessor Conflagration

(original .ipynb)
puzzle_input_str = open("puzzle_input/day23.txt").read()


def val(regs, v):
    if (v.isalpha()):
        return regs[v]
    return int(v)


def set_reg(regs, x, y):
    regs[x] = val(regs, y)
    return 1


def sub(regs, x, y):
    regs[x] -= val(regs, y)
    return 1


def mul(regs, x, y):
    regs[x] *= val(regs, y)
    return 1


def jnz(regs, x, y):
    if val(regs,x) != 0:
        return val(regs, y)
    return 1


def parse_program(program_str):
    return [
        line.split(" ") for line in program_str.split("\n")
    ]


instructions = {
    "set": set_reg,
    "sub": sub,
    "mul": mul,
    "jnz": jnz    
}


def part_one(input_str):
    pc = 0
    program = parse_program(input_str)
    regs = { r:0 for r in "abcdefgh" }
    mul_count = 0
    
    while pc >= 0 and pc < len(program):
        instr, x, y = program[pc]
        
        if instr == "mul":
            mul_count += 1
        
        pc += instructions[instr](regs, x, y)
    return mul_count


print("part one:", part_one(puzzle_input_str))
part one: 3969
def memoize(func):
    cache = []
    def memoizer(n):
        nonlocal cache
        if n > len(cache):
            cache = func(n)
        return cache 
    return memoizer


@memoize
def get_prime(n):
    prime = [True for i in range(n + 1)]
    fac = 2
    while fac * fac <= n + 1:
        if prime[fac]:
            for i in range(fac*fac, n + 1, fac):
                prime[i] = False
        fac += 1
    return prime


def is_prime(n):
    return get_prime(n)[n]
%%time
# my very very raw reverse engineered version of the program
# it's a bit slow

a, b, c, d, e, f, g, h = 1, 0, 0, 0, 0, 0, 0, 0

b = 65
c = 65

if a != 0:
    b = 100_000 + (b * 100)
    c = b + 17_000

g = 1
while g != 0:
    f = 1  
    
    if not is_prime(b):
        h += 1

    g = b - c
    b += 17

print("part two:", h)
part two: 917
CPU times: user 15.7 s, sys: 32.3 ms, total: 15.8 s
Wall time: 16 s