import fs from "fs-extra"; import fp from "lodash/fp.js"; import _ from "lodash"; import * as p1 from "./part1.mjs"; function getBasinSize([x, y], grid, seen) { if (seen[x][y]) return 0; seen[x][y] = true; if (grid[x][y] == 9) return 0; const neighbours = p1.genNeighbours(grid.length, grid[0].length); return _.sum([ 1, ...neighbours(x, y).map((n) => getBasinSize(n, grid, seen)), ]); } export function solution(grid) { const seen = grid.map(() => []); let basinSizes = []; for (const x of _.range(grid.length)) { for (const y of _.range(grid[x].length)) { basinSizes.push(getBasinSize([x, y], grid, seen)); } } return basinSizes .sort((a, b) => (a > b ? 1 : -1)) .splice(-3) .reduce(_.multiply); }