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