runProgram = function(program, inputs) {
const outputs = [];
let pos = 0;
let relativeBase = 0;
let opcode = program[pos];
while (opcode !== 99) {
const a = program[getParam(program, pos, relativeBase, opcode, 1)] || 0;
const b = program[getParam(program, pos, relativeBase, opcode, 2)] || 0;
const c = program[getParam(program, pos, relativeBase, opcode, 3)] || 0;
switch (parseInt(`${opcode}`.slice(-1), 10)) {
case 1:
program[getParam(program, pos, relativeBase, opcode, 3)] = a + b;
pos += 4;
break;
case 2:
program[getParam(program, pos, relativeBase, opcode, 3)] = a * b;
pos += 4;
break;
case 3:
program[getParam(program, pos, relativeBase, opcode, 1)] = inputs.shift();
pos += 2;
break;
case 4:
outputs.push(a);
pos += 2;
break;
case 5:
if (a !== 0) {
pos = b;
} else {
pos += 3;
}
break;
case 6:
if (a === 0) {
pos = b;
} else {
pos += 3;
}
break;
case 7:
program[getParam(program, pos, relativeBase, opcode, 3)] = a < b ? 1 : 0;
pos += 4;
break;
case 8:
program[getParam(program, pos, relativeBase, opcode, 3)] = a === b ? 1 : 0;
pos += 4;
break;
case 9:
relativeBase += a;
pos += 2;
break;
default:
throw new Error(`Invalid Opcode: ${opcode}`);
}
opcode = program[pos];
}
return outputs;
}