import * as R from "remeda"; import memo from "memoizerific"; import Victor from "@a-robu/victor"; import { printMap, outOfBound } from "./part1"; const V = (...args) => new Victor(...args); function visibility(forest, x, y, dx, dy) { const pos = V(x, y); const inc = V(dx, dy); let vis = 0; while (true) { pos.add(inc); if (outOfBound(forest.length)(pos)) return vis; if (forest[x][y] <= forest[pos.x][pos.y]) return 1 + vis; vis++; } } const visibilityAround = (forest) => (x, y) => { return [ [0, 1], [0, -1], [1, 0], [-1, 0], ] .map((d) => visibility(forest, x, y, ...d)) .reduce((a, b) => a * b); }; export default R.createPipe( (forest) => { const viz = Array(forest.length) .fill(null) .map(() => Array(forest.length).fill(0)); for (const x of R.range(0, forest.length)) { for (const y of R.range(0, forest.length)) { viz[x][y] = visibilityAround(forest)(x, y); } } return viz; }, R.flatten, R.maxBy(R.identity) );