import fs from "node:fs"; const DIRECTIONS = { UP: "up", DOWN: "down", LEFT: "left", RIGHT: "right", }; function rotate(currentDir) { switch (currentDir) { case DIRECTIONS.UP: return DIRECTIONS.RIGHT; case DIRECTIONS.RIGHT: return DIRECTIONS.DOWN; case DIRECTIONS.DOWN: return DIRECTIONS.LEFT; case DIRECTIONS.LEFT: return DIRECTIONS.UP; } } function getInput() { const data = fs .readFileSync("input2.txt", "utf8") .split("\n") .map((line) => line.split("")); return data; } function part1() { let data = getInput(); const HEIGHT = data.length; const WIDTH = data[0].length; let currentDir = DIRECTIONS.UP; let actualPos = { x: 0, y: 0 }; // Search initial pos for (let y = 0; y < HEIGHT; y++) { const x = data[y].indexOf("^"); if (x == -1) continue; data[y][x] = "X"; actualPos.y = y; actualPos.x = x; } // console.log(actualPos); // Start algorithm let counter = 1; let nextStep = null; let newX = null; let newY = null; while (true) { switch (currentDir) { case DIRECTIONS.UP: newY = actualPos.y - 1; newX = actualPos.x; break; case DIRECTIONS.DOWN: newY = actualPos.y + 1; newX = actualPos.x; break; case DIRECTIONS.LEFT: newY = actualPos.y; newX = actualPos.x - 1; break; case DIRECTIONS.RIGHT: newY = actualPos.y; newX = actualPos.x + 1; break; } nextStep = (data[newY] ?? [])[newX]; if (nextStep == undefined) break; if (nextStep == ".") { data[newY][newX] = "X"; actualPos.y = newY; actualPos.x = newX; counter++; } else if (nextStep == "X") { actualPos.y = newY; actualPos.x = newX; } else { currentDir = rotate(currentDir); } } console.log(counter); // print board // console.log(data.map((line) => line.join("")).join("\n")); } part1();