Public
Edited
Dec 20
Paused
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
function parse(input) {
return input.split("\n").map((d) => d.split(",").map(Number));
}
Insert cell
function buildGrid(bytes, size, n = Infinity) {
const grid = AOC.gInit(size, size, true);
bytes.slice(0, n).forEach(([x, y]) => (grid[y][x] = false));
return grid;
}
Insert cell
Insert cell
dirs = [
[-1, 0], // Up
[0, 1], // Right
[1, 0], // Left
[0, -1] // Down
]
Insert cell
Insert cell
function stepsToExit(grid) {
const size = grid.length;
const distances = AOC.gInit(size, size, Infinity);
distances[0][0] = 0;
const queue = [[0, 0]];

while (queue.length > 0) {
const [r, c] = queue.shift();
dirs.forEach(([dr, dc]) => {
const [r1, c1] = [r + dr, c + dc];
if (grid[r1]?.[c1] && distances[r1][c1] > distances[r][c] + 1) {
distances[r1][c1] = distances[r][c] + 1;
queue.push([r1, c1]);
}
});
}
return distances[size - 1][size - 1];
}
Insert cell
function part1(input) {
return stepsToExit(buildGrid(parse(puzzleInput), 71, 1024));
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
function part2(input) {
const bytes = parse(input);
let [left, right] = [0, bytes.length - 1];

while (left <= right) {
const mid = Math.floor((left + right) / 2);
const grid = buildGrid(bytes, 71, mid);

if (stepsToExit(grid) === Infinity) {
right = mid - 1; // Search left
} else {
left = mid + 1; // Search right
}
}
return `${bytes[right][0]},${bytes[right][1]}`;
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more