Public
Edited
May 10, 2023
1 fork
1 star
Insert cell
Insert cell
Insert cell
function parse(op) {
return op.trim().split(/\s+/);
}
Insert cell
function run(prog, registers = { a: 0, b: 0, c: 0, d: 0 }) {
for (let i = 0; i < prog.length; i++) {
const [op, x, y] = parse(prog[i]);
const regOrVal = (x) => (isNaN(Number(x)) ? registers[x] : Number(x));

switch (op) {
case "cpy":
registers[y] = regOrVal(x);
break;
case "inc":
registers[x]++;
break;
case "dec":
registers[x]--;
break;
case "jnz":
const value = regOrVal(x);
if (value !== 0) {
i += regOrVal(y) - 1;
}
break;
case "add":
registers[y] += regOrVal(x);
break;
case "noop":
break;
}
}
return registers.a;
}
Insert cell
Insert cell
function optimise(ops) {
const newOps = [...ops];
for (let i = 0; i < ops.length - 2; i++) {
const [op1, a1, b1] = parse(ops[i]);
if (op1 === "inc") {
const [op2, a2, b2] = parse(ops[i + 1]);
const [op3, a3, b3] = parse(ops[i + 2]);
if (op2 === "dec" && op3 === "jnz" && a3 === a2 && b3 === "-2") {
newOps[i] = "add " + a3 + " " + a1;
newOps[i + 1] = "cpy 0 " + a2;
newOps[i + 2] = "noop";
}
}
}
return newOps;
}
Insert cell
function part1(input) {
return run(optimise(puzzleInput.split("\n")));
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
function part2(input) {
return run(optimise(puzzleInput.split("\n")), {
a: 0,
b: 0,
c: 1,
d: 0
});
}
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