aoc-2024/day_14/solve_2.ts

73 lines
1.9 KiB
TypeScript
Raw Permalink Normal View History

2024-12-15 15:54:53 +09:00
import { loadInput, displayRobots, moveRobot, Robot } from "./solve_1.ts";
function calcGrid(robots: Robot[], width: number, height: number) {
const grid = Array.from(
{ length: height },
() => Array.from({ length: width }, () => 0),
);
for (const robot of robots) {
const [x, y] = robot.pos;
grid[y][x]++;
}
return grid;
}
const pattern = [
" 1 ",
" 111 ",
"11111",
" 111 ",
" 1 ",
]
function findChristmasTree(grid: number[][]) {
const width = grid[0].length;
const height = grid.length;
for (let y = 0; y < height - 4; y++) {
for (let x = 0; x < width - 4; x++) {
let found = true;
for (let dy = 0; dy < 5; dy++) {
for (let dx = 0; dx < 5; dx++) {
if (pattern[dy][dx] === "1" && grid[y + dy][x + dx] === 0) {
found = false;
break;
}
}
}
if (found) {
return [x + 2, y + 2];
}
}
}
return null;
}
if (import.meta.main) {
// const { data, width, height } = await loadExample();
const { data, width, height } = await loadInput();
data.sort((a, b) => a.pos[0] - b.pos[0] || a.pos[1] - b.pos[1]);
console.log(displayRobots(data, width, height));
console.log();
for (let i = 0;; i++) {
for (const robot of data) {
moveRobot(robot, width, height);
}
// find chrismas tree
const grid = calcGrid(data, width, height);
const tree = findChristmasTree(grid);
if (tree) {
console.log(tree);
console.log(displayRobots(data, width, height));
console.log(i);
await Deno.writeTextFile(`output-step-${i+1}.txt`, displayRobots(data, width, height));
break;
}
if (i > 11000) {
break;
}
}
}