Published
Edited
Dec 15, 2019
Insert cell
Insert cell
Insert cell
Insert cell
getParam = function(program, pos, relativeBase, opcode, param) {
let mode = '0';
if (opcode.toString().length >= param + 2) {
mode = opcode.toString().charAt(opcode.toString().length - 2 - param);
}
switch (mode) {
case '0': // position
return program[pos + param];
case '1': // immediate
return pos + param;
case '2': // relative
return relativeBase + program[pos + param];
default:
throw new Error('Invalid mode');
}
}
Insert cell
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: // add
program[getParam(program, pos, relativeBase, opcode, 3)] = a + b;
pos += 4;
break;
case 2: // multiply
program[getParam(program, pos, relativeBase, opcode, 3)] = a * b;
pos += 4;
break;
case 3: // input
program[getParam(program, pos, relativeBase, opcode, 1)] = inputs.shift();
pos += 2;
break;
case 4: // output
outputs.push(a);
pos += 2;
break;
case 5: // jump-if-true
if (a !== 0) {
pos = b;
} else {
pos += 3;
}
break;
case 6: // jump-if-false
if (a === 0) {
pos = b;
} else {
pos += 3;
}
break;
case 7: // less than
program[getParam(program, pos, relativeBase, opcode, 3)] = a < b ? 1 : 0;
pos += 4;
break;
case 8: // equals
program[getParam(program, pos, relativeBase, opcode, 3)] = a === b ? 1 : 0;
pos += 4;
break;
case 9: // relative base offset
relativeBase += a;
pos += 2;
break;
default:
throw new Error(`Invalid Opcode: ${opcode}`);
}
opcode = program[pos];
}
return outputs;
}
Insert cell
runProgram(input.slice(0), [1]);
Insert cell
Insert cell
runProgram(input.slice(0), [2]);
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more