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];
}