Advent of Code 2019 - Day 5
Advent of Code 2019 - Day 5
Intro
Day 5 required some additions to my Intcode computer - namely jumping and comparison operators. The puzzle also required me to implement support for parameter and immediate modes depending on the values left of the raw opcode.
Let’s get to it! As always, you can find my full solutions repo here.
Solution
The first step in extending capability is to support parameter and immediate modes for arguments. I addressed this by using a fixed size list and padding the extra space with 0’s (as the instructions outline). This fits all cases nicely since missing mode digits indicate a 0 and opcodes that won’t use the extra 0’s aren’t bothered by their inclusion in the data structure.
def get_param_modes(value):
if value < 100:
return [0, 0, 0]
value = value // 100
param_modes = [int(i) for i in str(value)]
while len(param_modes) < 3:
param_modes.insert(0, 0)
return param_modes
I’m taking a similar one-size-fits-all approach to the argument situation. By using the mode information, I can prep the arguments so that the opcode portion of the code doesn’t have to worry about this detail.
def parse_args(program, opcode, pc, param_modes):
args = [0, 0, 0]
# Opcodes w/ 1 arg
if opcode == 3:
args[0] = program[pc+1]
elif opcode == 4:
if param_modes[2] == 0:
args[0] = program[program[pc+1]]
else:
args[0] = program[pc+1]
# Opcodes w/ 2 or 3 args
elif opcode in (1, 2, 5, 6, 7, 8):
args[0] = program[program[pc+1]] if param_modes[2] == 0 else program[pc+1]
args[1] = program[program[pc+2]] if param_modes[1] == 0 else program[pc+2]
# Opcodes w/ 3 args
if opcode in (1, 2, 7, 8):
args[2] = program[pc+3]
return args
Implementing the new opcodes are pretty straightforward, although some of the
finer points require carefully reviewing the spec. Right now, I have my
implementation
as a large if-elif-else
chain but it’s starting to getunpleasant to look at.
If I hit another puzzle that requires Intcode, I’ll refactor the opcode sections
into individual functions. I’m not sure how that’ll look yet, but that’s a
problem for the future. (Is this…tech debt?)
Onward to day 6 (on December 10th…)!
As always, you can find my full solutions repo here.