2022-12-08 16:15:24 +00:00
|
|
|
import * as R from "remeda";
|
2022-12-08 21:19:44 +00:00
|
|
|
import memo from "memoizerific";
|
|
|
|
import Victor from "@a-robu/victor";
|
2022-12-08 16:15:24 +00:00
|
|
|
|
2022-12-08 21:19:44 +00:00
|
|
|
import { printMap, outOfBound } from "./part1";
|
2022-12-08 16:15:24 +00:00
|
|
|
|
2022-12-08 21:19:44 +00:00
|
|
|
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)
|
|
|
|
);
|