adventofcode/2022/08/part2.js

51 lines
1.0 KiB
JavaScript

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)
);