81 lines
1.3 KiB
TypeScript
81 lines
1.3 KiB
TypeScript
import { open } from "node:fs/promises";
|
|
|
|
const file = await open("./2024/inputs/6");
|
|
|
|
const map: string[][] = []
|
|
for await (const line of file.readLines()) {
|
|
map.push(line.split(""))
|
|
}
|
|
|
|
type Vector2 = {
|
|
X: number,
|
|
Y: number
|
|
}
|
|
|
|
// 0: UP
|
|
// 1: RIGHT
|
|
// 2: DOWN
|
|
// 3: LEFT
|
|
|
|
const directions: Vector2[] = [{
|
|
X: 0,
|
|
Y: -1
|
|
},
|
|
{
|
|
X: 1,
|
|
Y: 0
|
|
},
|
|
{
|
|
X: 0,
|
|
Y: 1
|
|
},
|
|
{
|
|
X: -1,
|
|
Y: 0
|
|
}]
|
|
|
|
const height = map.length
|
|
const width = map[0].length
|
|
|
|
let d = 0
|
|
|
|
const startY = map.findIndex(l => l.includes("^"))
|
|
const startX = map[startY].indexOf("^")
|
|
const position: Vector2 = {
|
|
X: startX,
|
|
Y: startY
|
|
}
|
|
|
|
function getNextCoordinates(): Vector2 {
|
|
return {
|
|
X: position.X + directions[d].X,
|
|
Y: position.Y + directions[d].Y
|
|
}
|
|
}
|
|
|
|
function getTile({ X, Y }: Vector2) {
|
|
if (X < 0 || Y < 0 || X >= width || Y >= height) {
|
|
return null
|
|
}
|
|
return map[Y][X]
|
|
}
|
|
|
|
function rotate() {
|
|
d = (d + 1) % 4
|
|
}
|
|
|
|
function moveForward() {
|
|
Object.assign(position, getNextCoordinates())
|
|
}
|
|
|
|
while (getTile(getNextCoordinates())) {
|
|
const tile = getTile(getNextCoordinates())
|
|
if (tile == "#") {
|
|
rotate()
|
|
} else {
|
|
moveForward()
|
|
}
|
|
map[position.Y][position.X] = "X"
|
|
}
|
|
|
|
console.log(map.reduce((acc, l) => l.reduce((acc, t) => t == "X" ? acc + 1 : acc, 0) + acc, 0)) |