adventofcode/2021/11/part1.mjs

69 lines
1.5 KiB
JavaScript

import fs from "fs-extra";
import fp from "lodash/fp.js";
import _ from "lodash";
export const processInput = (file) =>
fs.readFile(file, "utf8").then((content) =>
content
.split("\n")
.filter((x) => x)
.map((line) => line.split("").map((x) => parseInt(x)))
);
export const genNeighbours = (maxX, maxY) => (x, y) =>
[
[-1, 0],
[1, 0],
[0, 1],
[0, -1],
[1, 1],
[-1, -1],
[1, -1],
[-1, 1],
]
.map((delta) => _.zip(delta, [x, y]).map(_.sum))
.filter(([x, y]) => {
if (x < 0 || y < 0) return false;
if (x >= maxX || y >= maxY) return false;
return true;
});
function powerUp(x, y, grid, toClear) {
grid[x][y]++;
if (grid[x][y] !== 10) return 0;
// FLASH!
toClear.push([x, y]);
return _.sum([
1,
...genNeighbours(grid.length, grid[0].length)(x, y).map((coords) =>
powerUp(...coords, grid, toClear)
),
]);
}
export function playTurn(grid) {
let flashes = 0;
let toClear = [];
for (const x in grid) {
for (const y in grid[x]) {
flashes += powerUp(parseInt(x), parseInt(y), grid, toClear);
}
}
for (const [x, y] of toClear) {
grid[x][y] = 0;
}
return flashes;
}
export const printGrid = (grid) =>
grid.forEach((line) => console.log(line.join("")));
export const solution = (grid) =>
_.sum(_.range(100).map(() => playTurn(grid)));