From a5b9f37f3696b45ce38b8f76c611e2aa5a6df793 Mon Sep 17 00:00:00 2001 From: Baipyrus Date: Sun, 10 Dec 2023 15:58:54 +0100 Subject: [PATCH] flood through maze with dijkstra's --- Day10/Part1.js | 81 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/Day10/Part1.js b/Day10/Part1.js index 3a620a8..b4edf1f 100644 --- a/Day10/Part1.js +++ b/Day10/Part1.js @@ -1,8 +1,85 @@ import { readFileSync } from "fs"; const t0 = performance.now(); -const input = readFileSync("input.txt").toString(); -console.log(input); +const bends = { + "|": [ + [0, -1], + [0, 1], + ], + "-": [ + [-1, 0], + [1, 0], + ], + L: [ + [0, -1], + [1, 0], + ], + J: [ + [0, -1], + [-1, 0], + ], + 7: [ + [-1, 0], + [0, 1], + ], + F: [ + [1, 0], + [0, 1], + ], + S: [ + [1, 0], + [0, 1], + [-1, 0], + [0, -1], + ], +}; +const relPos = (pos, x, y) => pos.some((e) => e[0] === x && e[1] === y); +const compare = (a, b) => a.x === b.x && a.y === b.y; + +const input = readFileSync("input.txt") + .toString() + .split("\n") + .filter((e) => e.length > 0) + .map((e) => e.split("")); +const startY = input.findIndex((e) => e.includes("S")); +const startX = input[startY].findIndex((e) => e === "S"); + +const open = [ + { + distance: 0, + symbol: "S", + x: startX, + y: startY, + }, + ], + closed = []; +while (open.length > 0) { + const current = open.shift(); + closed.push(current); + + const directions = bends[current.symbol]; + for (let j = -1; j < 2; j++) + for (let i = -1; i < 2; i++) { + if (!relPos(directions, i, j)) continue; + + const { x, y, distance } = current; + const [nx, ny] = [x + i, y + j]; + const symbol = input[ny][nx]; + const nd = distance + 1; + const next = { + distance: nd, + symbol, + x: nx, + y: ny, + }; + + if (!relPos(bends[symbol], -i, -j)) continue; + if (closed.some((e) => compare(e, next))) continue; + + open.push(next); + } +} +console.log(closed.sort((a, b) => b.distance - a.distance)[0].distance); const t1 = performance.now(); console.log(`Runtime: ${t1 - t0}ms`);