54 lines
1016 B
JavaScript
54 lines
1016 B
JavaScript
|
import * as R from "remeda";
|
||
|
import { genCave, V } from "./part1.js";
|
||
|
|
||
|
function pourSand(cave) {
|
||
|
cave = R.clone(cave);
|
||
|
|
||
|
let sand = 0;
|
||
|
|
||
|
/** @type Victor */
|
||
|
let current;
|
||
|
|
||
|
const maxDepth =
|
||
|
R.pipe(
|
||
|
cave,
|
||
|
R.keys,
|
||
|
R.map((x) => parseInt(x)),
|
||
|
R.maxBy(R.identity)
|
||
|
) + 1;
|
||
|
|
||
|
while (true) {
|
||
|
if (!current) current = V(500, 0);
|
||
|
|
||
|
if (current.y === maxDepth) {
|
||
|
if (!cave[current.y]) cave[current.y] = {};
|
||
|
cave[current.y][current.x] = "o";
|
||
|
sand++;
|
||
|
current = null;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
const next = [
|
||
|
[0, 1],
|
||
|
[-1, 1],
|
||
|
[1, 1],
|
||
|
]
|
||
|
.map((args) => V(...args))
|
||
|
.map((v) => v.add(current))
|
||
|
.find((v) => !(cave[v.y] && cave[v.y][v.x]));
|
||
|
|
||
|
if (next) {
|
||
|
current = next;
|
||
|
} else {
|
||
|
if (current.y === 0) return 1 + sand;
|
||
|
|
||
|
if (!cave[current.y]) cave[current.y] = {};
|
||
|
cave[current.y][current.x] = "o";
|
||
|
sand++;
|
||
|
current = null;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default R.createPipe(genCave, pourSand);
|