55 lines
1.3 KiB
JavaScript
55 lines
1.3 KiB
JavaScript
var pc = [0,0];
|
|
var registers = [{p: 0}, {p: 1}];
|
|
var lastsnd = [0,0];
|
|
var queue = [[],[]];
|
|
var instructions = require("fs").readFileSync("input.txt").toString().split("\n").filter((a)=>(a));
|
|
var deadlock = 0;
|
|
var numSends = [0, 0];
|
|
while(deadlock < 2){
|
|
deadlock = 0;
|
|
for(var p = 0; p <= 1; p++){
|
|
if((pc[p] >= 0) && (pc[p] < instructions.length)){
|
|
val = a => ((isNaN(parseInt(a))) ? (registers[p][a]) : (parseInt(a)));
|
|
var instruction = instructions[pc[p]];
|
|
var parts = instruction.split(" ");
|
|
switch(parts[0]){
|
|
case "snd":
|
|
numSends[p]++;
|
|
queue[1-p].push(val(parts[1]));
|
|
break;
|
|
case "set":
|
|
registers[p][parts[1]] = val(parts[2]);
|
|
break;
|
|
case "add":
|
|
registers[p][parts[1]] += val(parts[2]);
|
|
break;
|
|
case "mul":
|
|
registers[p][parts[1]] *= val(parts[2]);
|
|
break;
|
|
case "mod":
|
|
registers[p][parts[1]] = registers[p][parts[1]] % val(parts[2]);
|
|
break;
|
|
case "rcv":
|
|
if(queue[p].length >= 1){
|
|
registers[p][parts[1]] = queue[p].splice(0,1)[0];
|
|
}
|
|
else{
|
|
pc[p]--;
|
|
deadlock++;
|
|
}
|
|
break;
|
|
case "jgz":
|
|
if(val(parts[1]) > 0){
|
|
pc[p] += (val(parts[2]) - 1);
|
|
}
|
|
break;
|
|
}
|
|
pc[p]++;
|
|
}
|
|
else{
|
|
deadlock++;
|
|
}
|
|
}
|
|
}
|
|
console.log(numSends[1]);
|