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