AdventOfCode2024/06/index.ts

76 lines
1.9 KiB
TypeScript
Raw Normal View History

import fs from "node:fs";
import { printTime, now } from "../util";
type tile = { guard: boolean; blocked: boolean; visited: boolean };
const test = true;
const data = fs.readFileSync(
test ? "./inputs/testinput" : "./inputs/input",
"utf8"
);
let timer = now.instant();
console.log(
"part one:",
(() => {
let floor = data
.split("\n")
.slice(0, -1)
.reduce((floor, row, i) => {
row.split("").forEach((v, col) => {
floor[`${i}|${col}`] = {
guard: v === "^",
blocked: v === "#",
visited: false,
};
});
return floor;
}, {} as Record<string, tile>);
let direction = "north";
let [guard] = Object.entries(floor).filter((tile) => tile[1].guard)[0];
while (true) {
let [x, y] = guard.split("|").map((v) => parseInt(v, 10));
floor[guard].visited = true;
let next = "";
switch (direction) {
case "north":
next = `${x - 1}|${y}`;
break;
case "south":
next = `${x + 1}|${y}`;
break;
case "east":
next = `${x}|${y + 1}`;
break;
case "west":
next = `${x}|${y - 1}`;
break;
}
if (floor[next] === undefined) {
break;
}
if (!floor[next].blocked) {
floor[next].guard = true;
floor[guard].guard = false;
guard = next;
} else {
if (direction === "north") {
direction = "east";
} else if (direction === "east") {
direction = "south";
} else if (direction === "south") {
direction = "west";
} else if (direction === "west") {
direction = "north";
}
}
}
return Object.entries(floor).reduce((total, tile) => {
return total + (tile[1].visited ? 1 : 0);
}, 0);
})(),
printTime(now.instant().since(timer))
);