Public
Edited
Oct 2, 2023
1 fork
1 star
Insert cell
Insert cell
Insert cell
function parse(prog) {
const instrs = [];
for (const instr of prog.split("\n")) {
instrs.push(instr.split(/\s+/));
}
return instrs;
}
Insert cell
function run1(instrs) {
const registers = {};
let [last, recovered] = [null, null];
const getVal = (v) => (isNaN(Number(v)) ? registers[v] || 0 : Number(v));

for (let i = 0; i < instrs.length; i++) {
const [instr, x, y] = instrs[i];
switch (instr) {
case "snd":
last = getVal(x);
break;
case "set":
registers[x] = getVal(y);
break;
case "add":
registers[x] = getVal(x) + getVal(y);
break;
case "mul":
registers[x] = getVal(x) * getVal(y);
break;
case "mod":
registers[x] = getVal(x) % getVal(y);
break;
case "jgz":
if (getVal(x) > 0) {
i += getVal(y) - 1; // Subtract 1 because the for-loop will add 1
}
break;
case "rcv":
if (getVal(x) !== 0) {
recovered = last;
return recovered; // Program terminates, reproting recovered frequency.
}
break;
}
}
}
Insert cell
function part1(input) {
return run1(parse(input));
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
function run2(instrs) {
const registers = [{ p: 0 }, { p: 1 }];
const queues = [[], []];
let countSends = [0, 0];
let i = [0, 0];
const getVal = (prog, v) =>
isNaN(Number(v)) ? registers[prog][v] || 0 : Number(v);

let changed = true;
while (changed) {
changed = false;
for (let prog = 0; prog < 2; prog++) {
if (i[prog] >= 0 && i[prog] < instrs.length) {
const [instr, x, y] = instrs[i[prog]];
switch (instr) {
case "snd":
queues[1 - prog].push(getVal(prog, x));
countSends[prog]++;
break;
case "set":
registers[prog][x] = getVal(prog, y);
break;
case "add":
registers[prog][x] = getVal(prog, x) + getVal(prog, y);
break;
case "mul":
registers[prog][x] = getVal(prog, x) * getVal(prog, y);
break;
case "mod":
registers[prog][x] = getVal(prog, x) % getVal(prog, y);
break;
case "jgz":
if (getVal(prog, x) > 0) {
i[prog] += getVal(prog, y);
changed = true;
continue;
}
break;
case "rcv":
if (queues[prog].length > 0) {
registers[prog][x] = queues[prog].shift();
} else {
continue;
}
break;
}
i[prog]++;
changed = true;
}
}
}
return countSends[1];
}
Insert cell
function part2(input) {
return run2(parse(input));
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
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