function parse(input) {
const rocks = input
.split("\n")
.map((l) => l.split(" -> ").map((pair) => pair.split(",").map(Number)));
const [minX, maxX, maxY] = [
Math.min(...rocks.flat().map(([x, y]) => x)),
Math.max(...rocks.flat().map(([x, y]) => x)),
Math.max(...rocks.flat().map(([x, y]) => y))
];
const startX = 500 - minX;
const cave = AOC.gInit(maxY + 1, maxX - minX + 1, ".");
const addSeg = ([x0, y0], [x1, y1]) => {
for (let x = Math.min(x0, x1); x <= Math.max(x0, x1); x++) {
for (let y = Math.min(y0, y1); y <= Math.max(y0, y1); y++) {
cave[y][x - minX] = "#";
}
}
};
rocks.forEach((path) => {
for (let i = 1; i < path.length; i++) {
addSeg(path[i - 1], path[i]);
}
});
return [startX, cave];
}