Add solution day 6
This commit is contained in:
parent
fa4ca32939
commit
c058b50fea
10
day_6/example.txt
Normal file
10
day_6/example.txt
Normal file
@ -0,0 +1,10 @@
|
||||
....#.....
|
||||
.........#
|
||||
..........
|
||||
..#.......
|
||||
.......#..
|
||||
..........
|
||||
.#..^.....
|
||||
........#.
|
||||
#.........
|
||||
......#...
|
130
day_6/input.txt
Normal file
130
day_6/input.txt
Normal file
@ -0,0 +1,130 @@
|
||||
......................#...#..............#.....................................#...#..............##..............................
|
||||
......#.....#................#....#...........#........#......................#...............................#.....#.#.###..#...#
|
||||
...#.#.................#........#.................#.........................................................#.....................
|
||||
.....................................................................................................#.........#..................
|
||||
.............................#.................#...................................#.....#....#........................#....#.....
|
||||
..........................#.....................................................................#..#.............#................
|
||||
.................#...........................#..........................#..............................#.#..#...................#.
|
||||
..#....#....#......................................................................#....#.........................................
|
||||
..................................#............#...........#...........................................#.#....#.............#.#...
|
||||
...#...##....................................................................................#..........#..................#......
|
||||
..................#.....#......#.....#...#.........#..#.............................#....##.............#...............##.#..#...
|
||||
......#...............................................................................................................#..........#
|
||||
...........#................................#.......#.............#...............#...................................#...........
|
||||
............##...........................#........................................................................#...............
|
||||
...............................#........#...#.................................#..#.#.............#...........#....................
|
||||
........#..........#.#....................................................#........#....#..#.................................#....
|
||||
.........#..............#........................#................................................................................
|
||||
..................#..........................#.............#..................#.#...........#.....#...............................
|
||||
...#...........#.#..........#.....................................................................................................
|
||||
..............#.................#.....................................................................#...#......#.....#..........
|
||||
..#.....#................................................................................................#.#.....#..........#.....
|
||||
#.#..........#...#.............................#...............#..................................................#.#.............
|
||||
..........................#..#.............#................................................................................#.....
|
||||
...#..............................................................................................#..............#..#.......#.....
|
||||
........................................#......#........................................#...................##...........#........
|
||||
.............#..............#...........................##...#............#.....#..#..............................................
|
||||
..#....#..#...............#........#.................#............................................#........##...............#.....
|
||||
................................................#.......#...........##.............................#.##...........................
|
||||
............................#..............#..#...........#...#.....#.#...................#.....#.............................#...
|
||||
....................#....................................................................................#........................
|
||||
.......................................................................................#.......................##..#..............
|
||||
#.............................#.............................................................#............................#........
|
||||
..............................................................................#.............#...#.........##......................
|
||||
...............#..........................#.............#............#...........................................#................
|
||||
................#........................#................................#...#............#.............................#........
|
||||
..............................................................#.....#..........#.......#........#....#..................#.........
|
||||
........................................................#..............................................................#.......#..
|
||||
..#........#............#........#...#.....#.......#..............................................................................
|
||||
..#..............#.#.....................................#..................................................#....##...............
|
||||
............#........................#..........##.................................................................#........#.....
|
||||
............#............#.#...............................................#.......#..............................................
|
||||
..................#.........................................#............................#......#..................#...........#..
|
||||
........................................................#.............##................................#........................#
|
||||
.....................#...#......#.......#............#........#..................#...#.#....................................#.....
|
||||
...........................................................................................#..............................#....#..
|
||||
....#...................#.............#..........#..................................#.............................................
|
||||
......................................#...............................................#..#........................................
|
||||
.................#..#............................................#.............................................................#.#
|
||||
............##...................................................................................#.........................#......
|
||||
.........#.................................................#..#........................................#.....#..........#.....#...
|
||||
.........#........................................................................................#.#...............#............#
|
||||
..........#..#...........#...................#.....#.......#......#....#..#.......................#..........#..........#.........
|
||||
......#...................................................#....#..............#....#.........##...#...............................
|
||||
.........#........#........................#...........................................................#.......#................#.
|
||||
.....................#...............................................#.##.........................................................
|
||||
................................................................................#.............#..............#............#.......
|
||||
......#..........#............................................#...#....................#...............................#.........#
|
||||
......................................#....#.........#..............................................................#...#.........
|
||||
.......##...#.#..........................................................#............#...........#........#...................#..
|
||||
.....#............................................................................#............................#..................
|
||||
....#..................#....#......#......#......................#......................#.......................................#.
|
||||
..#..............#..#............#.................................#............#..................#................#.............
|
||||
........................................................#....#...................................##.......................#.......
|
||||
..........#..................................#....#........#.......#..........................#................#...............#..
|
||||
.....................................#.................#..................#...........#...........................................
|
||||
.........#..............#...................................................................................#...................#.
|
||||
.................##.................................#.......#.......................................................#.........#...
|
||||
...........#.................#..........................#...............................#..#...........................#..........
|
||||
.....................................#...........................#...................#..............................#..#..........
|
||||
.............................#.....#.................................................#.................##...............#.......#.
|
||||
............#.........................................................................................................#...........
|
||||
..........##.............#...................#.#...........................................#....................................##
|
||||
..........#..#...#...............#........#........................................................#.................#............
|
||||
....................#......................#....................................................#.#.....................#.........
|
||||
.......................................#............#........................##............#....#..#..............................
|
||||
..........#..........#.....................................#.................................#.......#............................
|
||||
....#.............#...............................................................................................................
|
||||
..#..............................................#....#......#........................................#.................#.........
|
||||
...#......#.....#..............................#....#....................#......#..................#...................#.......#..
|
||||
...............#..#...........................##..................................................................................
|
||||
........#..#.....#.........................#.......#.............#..........................................#................#....
|
||||
...#......#.............#...............#.............................................................................##..........
|
||||
#.................................#.......#.........#.#.#...................................#...#.#...........#..........#........
|
||||
#.........#....#...#.........#.#.............................................................#....................................
|
||||
........................#.#.......#.................................................#.............................................
|
||||
...#...##...#..#...........................#.....#..........................#...............................#.......#.............
|
||||
................#..............................#..........##...................................................................#..
|
||||
.......................................................................#...#..#...#.....#....#..................##..........#.....
|
||||
#.....................#.........#........#.....................................................................#.....#.......#....
|
||||
...........#......................#.......#.................................................#........................#............
|
||||
.......#.........................................#.....#...#...........#................#....#......#...........#......#..........
|
||||
....#.............#...............................#...#....#..#..#...........................................#.............#......
|
||||
...#.........#..........................................#.....#...........^.#...#....#...........................#................
|
||||
.....#..#...............#...........................#.#..........#........................................................#.......
|
||||
.............#.......#.............................................................................................#...#..........
|
||||
..#...................#...............................#......#............#...........#.......#...................................
|
||||
...........#.......................#..........#...#.......................#..............#.............##.............#..#........
|
||||
..#............#.............#.......................................................#.....##....................................#
|
||||
.#.........#.....................................................................#.........#......................................
|
||||
.............#....................................................................#.....#.............#...#...........#..........#
|
||||
..........................#.....#...#......................#.................................#.....#.................#.......#....
|
||||
..........#.#.....................................................................................................................
|
||||
............#.......#....................#.......#.............................................#..................................
|
||||
.......................................#..#........#...................................................#..........................
|
||||
...................#........#....#........#..................#..........................................................#.........
|
||||
........#..............#....................#............#......#...........#.....#..............................#.........#......
|
||||
.......#.....#.................#.#..#..............................................................#.......#..#...........#......#
|
||||
.#....................##.....................................................#...#.....#..........................................
|
||||
...........#..................#.....#....#............#...............#....#............#.......................#.................
|
||||
........#.....................................#......##............#..........................#..........#....................#...
|
||||
..........................#...............................................................#.......................................
|
||||
......................#..................................#.....................#.............................................#...#
|
||||
.........#..............................................................#........##.........#.......#.............................
|
||||
....#...#........#...........#....#.............#............#.....#..............................................................
|
||||
...........#...............................................................................................#.......#..#...........
|
||||
........#..........................#............................#...........#............#.............................#..........
|
||||
.......#...........................#...#...............#..#..#...................#.........#......................................
|
||||
..#..............................#........#...........#.......................................#...#...............................
|
||||
.............#...#.............#.........#...........#.....................................#................#.....................
|
||||
.........................#..........................#.................................#...........................................
|
||||
..................##.............#........#......#............#........................#.......#......................#....#......
|
||||
.....#............................................................................................................................
|
||||
.#..................................#.....#.............#...#.............................................#..............#..##..#.
|
||||
...............#........................................................#.........#..#..........#.........................#.......
|
||||
.............................................#...................#.................#..................#......................#....
|
||||
............................#.......................................................................................#.............
|
||||
............#...............#....................#....#..........#..#..............................#......#.......#.......##......
|
||||
............#.................................................................................#...................................
|
||||
........................#...............................................................#......#.......#.......#.......###......#.
|
||||
......................................#.#.........................................#.....#.............................#.........#.
|
139
day_6/solve_1.ts
Normal file
139
day_6/solve_1.ts
Normal file
@ -0,0 +1,139 @@
|
||||
export async function readMap(path: string) {
|
||||
const text = await Deno.readTextFile(path);
|
||||
return text.split("\n").map((line) => line.trim().split(""));
|
||||
}
|
||||
export function mapForEach(
|
||||
map: string[][],
|
||||
callback: (x: number, y: number, value: string) => void,
|
||||
) {
|
||||
map.forEach((line, y) => {
|
||||
line.forEach((value, x) => {
|
||||
callback(x, y, value);
|
||||
});
|
||||
});
|
||||
}
|
||||
export function mapFind(
|
||||
map: string[][],
|
||||
callback: (x: number, y: number, value: string) => boolean,
|
||||
) {
|
||||
for (let y = 0; y < map.length; y++) {
|
||||
const line = map[y];
|
||||
for (let x = 0; x < line.length; x++) {
|
||||
if (callback(x, y, line[x])) {
|
||||
return { x, y, value: line[x] };
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
export function displayMap(map: string[][]) {
|
||||
map.forEach((line) => {
|
||||
console.log(line.join(""));
|
||||
});
|
||||
}
|
||||
|
||||
export type Dir = "N" | "E" | "S" | "W";
|
||||
export type Pos = { x: number; y: number };
|
||||
export type Guard = { pos: Pos; direction: Dir };
|
||||
|
||||
export function step(pos: Pos, direction: Dir) {
|
||||
const next = { ...pos };
|
||||
switch (direction) {
|
||||
case "N":
|
||||
next.y -= 1;
|
||||
break;
|
||||
case "E":
|
||||
next.x += 1;
|
||||
break;
|
||||
case "S":
|
||||
next.y += 1;
|
||||
break;
|
||||
case "W":
|
||||
next.x -= 1;
|
||||
break;
|
||||
}
|
||||
return next;
|
||||
}
|
||||
export function rotateLeft(direction: Dir) {
|
||||
switch (direction) {
|
||||
case "N":
|
||||
return "W";
|
||||
case "E":
|
||||
return "N";
|
||||
case "S":
|
||||
return "E";
|
||||
case "W":
|
||||
return "S";
|
||||
}
|
||||
}
|
||||
export function rotateRight(direction: Dir) {
|
||||
switch (direction) {
|
||||
case "N":
|
||||
return "E";
|
||||
case "E":
|
||||
return "S";
|
||||
case "S":
|
||||
return "W";
|
||||
case "W":
|
||||
return "N";
|
||||
}
|
||||
}
|
||||
|
||||
export const EMPTY = ".";
|
||||
export const WALL = "#";
|
||||
const G = "X";
|
||||
|
||||
export function moveGuard(guard: Guard, map: string[][]): Guard | "out" {
|
||||
const { direction } = guard;
|
||||
const next = step(guard.pos, direction);
|
||||
// Check if next position is out of bounds
|
||||
if (
|
||||
next.y < 0 ||
|
||||
next.y >= map.length ||
|
||||
next.x < 0 ||
|
||||
next.x >= map[next.y].length
|
||||
) {
|
||||
// Out of bounds
|
||||
return "out";
|
||||
}
|
||||
// Check if next position is a wall
|
||||
if (map[next.y][next.x] === WALL) {
|
||||
// Turn right
|
||||
const right = rotateRight(direction);
|
||||
return { ...guard, direction: right };
|
||||
}
|
||||
return { ...guard, pos: next };
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (import.meta.main) {
|
||||
const map = await readMap("input.txt");
|
||||
const guardPos = mapFind(map, (_x, _y, value) => value === "^");
|
||||
if (!guardPos) {
|
||||
throw new Error("Guard not found");
|
||||
}
|
||||
const { x, y } = guardPos;
|
||||
let guard: Guard = {
|
||||
pos: { x, y },
|
||||
direction: "N",
|
||||
};
|
||||
map[y][x] = G;
|
||||
|
||||
for (;;) {
|
||||
const n = moveGuard(guard, map);
|
||||
if (n === "out") {
|
||||
break;
|
||||
}
|
||||
guard = n;
|
||||
map[guard.pos.y][guard.pos.x] = G;
|
||||
}
|
||||
displayMap(map);
|
||||
let count = 0;
|
||||
mapForEach(map, (_x, _y, value) => {
|
||||
if (value === G) {
|
||||
count++;
|
||||
}
|
||||
});
|
||||
console.log(count);
|
||||
}
|
81
day_6/solve_2.ts
Normal file
81
day_6/solve_2.ts
Normal file
@ -0,0 +1,81 @@
|
||||
import { readMap, mapFind, Guard, moveGuard, displayMap, mapForEach, Dir, EMPTY, Pos } from "./solve_1.ts";
|
||||
|
||||
function getMDir(
|
||||
dir: Dir,
|
||||
mapValue: string
|
||||
){
|
||||
if (mapValue === "+") {
|
||||
return mapValue;
|
||||
}
|
||||
if (dir === mapValue || mapValue === EMPTY){
|
||||
return dir;
|
||||
}
|
||||
return "+";
|
||||
}
|
||||
|
||||
function loopDetect(
|
||||
obstaclePos: Pos,
|
||||
guard: Guard,
|
||||
map: string[][]
|
||||
){
|
||||
map[obstaclePos.y][obstaclePos.x] = "#";
|
||||
try {
|
||||
let doubleMoveGaurd: Guard | "out" = guard;
|
||||
for(;;){
|
||||
const n = moveGuard(guard, map);
|
||||
if (n === "out"){
|
||||
return false;
|
||||
}
|
||||
guard = n;
|
||||
doubleMoveGaurd = moveGuard(doubleMoveGaurd, map);
|
||||
if (doubleMoveGaurd === "out"){
|
||||
return false;
|
||||
}
|
||||
doubleMoveGaurd = moveGuard(doubleMoveGaurd, map);
|
||||
if (doubleMoveGaurd === "out"){
|
||||
return false;
|
||||
}
|
||||
if (guard.pos.x === doubleMoveGaurd.pos.x && guard.pos.y === doubleMoveGaurd.pos.y
|
||||
&& guard.direction === doubleMoveGaurd.direction
|
||||
){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
finally {
|
||||
map[obstaclePos.y][obstaclePos.x] = ".";
|
||||
}
|
||||
}
|
||||
|
||||
if (import.meta.main) {
|
||||
const map = await readMap("input.txt");
|
||||
const guardPos = mapFind(map, (_x, _y, value) => value === "^");
|
||||
if (!guardPos) {
|
||||
throw new Error("Guard not found");
|
||||
}
|
||||
const { x, y } = guardPos;
|
||||
let guard: Guard = {
|
||||
pos: { x, y },
|
||||
direction: "N",
|
||||
};
|
||||
map[y][x] = "|"
|
||||
|
||||
let count = 0;
|
||||
for (;;) {
|
||||
const n = moveGuard(guard, map);
|
||||
if (n === "out") {
|
||||
break;
|
||||
}
|
||||
if (map[n.pos.y][n.pos.x] === EMPTY){
|
||||
if (loopDetect(n.pos, guard, map)){
|
||||
console.log(n.pos);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
guard = n;
|
||||
const v = map[guard.pos.y][guard.pos.x];
|
||||
map[guard.pos.y][guard.pos.x] = getMDir(guard.direction, v);
|
||||
}
|
||||
displayMap(map);
|
||||
console.log(count);
|
||||
}
|
Loading…
Reference in New Issue
Block a user