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); 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)) );