From ec608aae63ee89783a68453171a16e4d745b3d26 Mon Sep 17 00:00:00 2001 From: Baipyrus Date: Sun, 10 Dec 2023 16:03:18 +0100 Subject: [PATCH] init d10p2 --- Day10/Part2.js | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 Day10/Part2.js diff --git a/Day10/Part2.js b/Day10/Part2.js new file mode 100644 index 0000000..99ff2eb --- /dev/null +++ b/Day10/Part2.js @@ -0,0 +1,86 @@ +import { readFileSync } from "fs"; +const t0 = performance.now(); + +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); + } +} +const furthest = closed.sort((a, b) => b.distance - a.distance)[0]; +console.log(furthest.distance); + +const t1 = performance.now(); +console.log(`Runtime: ${t1 - t0}ms`);