function round(elves, grid, first) {
const moves = [
[-1, 0],
[1, 0],
[0, -1],
[0, 1]
];
let elvesMoved = 0;
const fTable = new Map();
const nextElves = elves.map(([r, c]) => {
const ns = neighbours(r, c, grid);
const occupiedSides = ns.filter(AOC.identity).length;
if (occupiedSides === 0 || occupiedSides === 4) {
AOC.addToFreqTable(fTable, r + "," + c);
return [r, c];
}
for (let i = first; i < first + 4; i++) {
if (!ns[i % 4]) {
const newPos = AOC.vAdd([r, c], moves[i % 4]);
AOC.addToFreqTable(fTable, newPos[0] + "," + newPos[1]);
return newPos;
}
}
});
for (let i = 0; i < elves.length; i++) {
const [r, c] = elves[i];
const [rNext, cNext] = nextElves[i];
if ((rNext != r || cNext != c) && fTable.get(rNext + "," + cNext) === 1) {
elvesMoved++;
elves[i] = [rNext, cNext];
grid[r][c] = 0;
grid[rNext][cNext] = 1;
}
}
return elvesMoved;
}