aoc-2023/day_21/solve_2.ts

133 lines
3.7 KiB
TypeScript
Raw Permalink Normal View History

2024-12-09 22:41:02 +09:00
const input = await Deno.readTextFile("input.txt");
const initMap = input.split("\n").map(x => x.trim())
.filter(x => x.length > 0)
.map(x => x.split(""));
function map2d<T, S>(map: T[][], fn: (ch: T, x: number, y: number) => S): S[][] {
return map.map((line, y) => line.map((ch, x) => fn(ch, x, y)));
}
function mapToString(map: (string | number)[][]) {
return map.map(x => x.map(ch => `${ch}`).join(",")).join("\n");
}
function newMap() {
return map2d(initMap, (ch, x, y) => {
return ch === "S" ? (".") : ch;
}) as (string | number)[][];
}
let map = newMap();
map[65][65] = 0;
// let map = map2d(initMap, (ch, x, y) => {
// return ch === "S" ? (0 as number) : ch;
// });
// let map = map2d(initMap, (ch, x, y) => {
// return ch === "S" ? 0 : (ch === "." ? "unknown" : "rock");
// });
function cycle(map: (string | number)[][], steps: number) {
for (let step = 0; step < steps; step++) {
// copy map
const nextMap = map2d(map, (ch) => { return ch; });
// propagate steps
map2d(map, (ch, x, y) => {
if (typeof ch === "number") {
const nextStep = ch + 1;
const min = (a: number, b: number | string) => {
if (typeof b === "string") {
return a;
}
return Math.min(a, b);
}
if (x > 0 && nextMap[y][x - 1] !== "#") {
nextMap[y][x - 1] = min(nextStep, nextMap[y][x - 1]);
}
if (x < map[0].length - 1 && map[y][x + 1] != "#") {
nextMap[y][x + 1] = min(nextStep, nextMap[y][x + 1]);
}
if (y > 0 && map[y - 1][x] != "#") {
nextMap[y - 1][x] = min(nextStep, nextMap[y - 1][x]);
}
if (y < map.length - 1 && map[y + 1][x] != "#") {
nextMap[y + 1][x] = min(nextStep, nextMap[y + 1][x]);
}
}
return nextMap[y][x];
});
map = nextMap;
}
// console.log(mapToString(map));
const even = map.map(line => line.map(x => typeof x === "number" ? (x % 2) : 0)
.reduce((a, b) => a + b, 0)).reduce((a, b) => a + b, 0);
const odd = map.map(line => line.map(x => typeof x === "number" ? ((x + 1) % 2) : 0)
.reduce((a, b) => a + b, 0)).reduce((a, b) => a + b, 0)
console.log("even", even);
console.log("odd", odd);
return {
even,
odd
}
}
console.log("full fill")
cycle(map, 131 * 2);
map = map2d(initMap, (ch, x, y) => {
return ch === "S" ? (".") : ch;
});
console.log("0,0 start cycle 131 - 65")
map[0][0] = 0;
cycle(map, 131 - 65);
console.log("cycle 131 + 65")
cycle(map, 131 + 65);
map[0][0] = ".";
console.log("130,0 start cycle 131 - 65")
map[130][0] = 0;
cycle(map, 131 - 65);
console.log("cycle 131 + 65")
cycle(map, 131 + 65);
map[130][0] = ".";
console.log("0,130 start cycle 131 - 65")
map[0][130] = 0;
cycle(map, 131 - 65);
console.log("cycle 131 + 65")
cycle(map, 131 + 65);
map[0][130] = ".";
console.log("130,130 start cycle 131 - 65")
map[130][130] = 0;
cycle(map, 131 - 65);
console.log("cycle 131 + 65")
cycle(map, 131 + 65);
map[130][130] = ".";
console.log("65,0 start cycle 131")
// map = newMap();
map[65][0] = 0;
cycle(map, 131);
map[65][0] = ".";
console.log("0,65 start cycle 131")
// map = newMap();
map[0][65] = 0;
cycle(map, 131);
map[0][65] = ".";
console.log("130, 65 start cycle 131")
// map = newMap();
map[131 - 1][65] = 0;
cycle(map, 131);
map[131 - 1][65] = ".";
console.log("65,130 start cycle 131")
// map = newMap();
map[65][131 - 1] = 0;
cycle(map, 131);
map[65][131 - 1] = ".";