Sean McLemon | Advent of Code

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


2019-12-02 - 1202 Program Alarm

(original .ipynb)

Day 2 puzzle input is a list of integers which represent opcodes which comprise a small program (mine is here). Part 1 involves writing an interpreter for these opcodes and finding the result. Part 2 involves finding values you can swap into the second and third positions of the code result in the largest output value.

opcode_add = 1
opcode_mul = 2
opcode_terminate = 99

def op_add(x, y):
    return x + y

def op_mul(x, y):
    return x * y

def decode_op(op):
    if op == opcode_add:
        return op_add
    elif op == opcode_mul:
        return op_mul
    else:
        raise Exception(f"Invalid opcode {op}")

def run_intcode(program):
    pc = 0
    opcode = program[pc]
    
    while opcode != opcode_terminate:
        arg0 = program[pc + 1]
        arg1 = program[pc + 2]
        dest = program[pc + 3]
        
        op = decode_op(opcode)
        program[dest] = op(program[arg0], program[arg1])
        
        pc += 4
        opcode = program[pc]
    
    return program[0]

assert 2 == run_intcode([1,0,0,0,99])
assert 2 == run_intcode([2,3,0,3,99])
assert 2 == run_intcode([2,4,4,5,99,0])
assert 30 == run_intcode([1,1,1,4,99,5,6,0,99])
puzzle_input_lines = open("puzzle_input/day2.txt", "r").read().split(",")
puzzle_input = [int(line) for line in puzzle_input_lines]

def run_program(noun, verb, program):
    program_copy = [ x for x in program ]
    program_copy[1] = noun
    program_copy[2] = verb
    return run_intcode(program_copy)

print(run_program(12, 2, puzzle_input))
3101844
def brute_force_noun_verb():
    for noun in range(0, 100):
        for verb in range(0, 100):
            answer = run_program(noun, verb, puzzle_input)

            if answer == 19690720:
                return (100 * noun) + verb
            
    raise Exception("No appropriate noun/verb pair found")

print(brute_force_noun_verb())
8478
# test that [99] just returns 99 for sake of curiosity. [1],[2,1] etc will probably raise argument out of range exception
print(run_intcode([99]))
99