day 6 part 1 is straightforward... part 2... hmmm
This commit is contained in:
parent
13667f414b
commit
7b9293f974
75
06/index.ts
Normal file
75
06/index.ts
Normal file
@ -0,0 +1,75 @@
|
||||
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))
|
||||
);
|
Loading…
Reference in New Issue
Block a user