From e57d0b97c8cb365d7d0a3ee7a0fc9294d2c8dcee Mon Sep 17 00:00:00 2001
From: eug-vs <eugene@eug-vs.xyz>
Date: Sat, 9 Dec 2023 02:23:56 +0300
Subject: feat(day-8): add part 2 solution

---
 day-8/script.ts | 49 ++++++++++++++++++++++++++++++++-----------------
 1 file changed, 32 insertions(+), 17 deletions(-)

(limited to 'day-8')

diff --git a/day-8/script.ts b/day-8/script.ts
index 71849c7..87e33cd 100644
--- a/day-8/script.ts
+++ b/day-8/script.ts
@@ -1,5 +1,13 @@
 import fs from "fs";
 
+function gcd(a: number, b: number) {
+  return !b ? a : gcd(b, a % b);
+}
+
+function lcm(a: number, b: number) {
+  return (a * b) / gcd(a, b);
+}
+
 const [directions, _, ...lines] = fs
   .readFileSync("./input.txt")
   .toString()
@@ -17,26 +25,33 @@ const nodes = lines
     };
   })
   .map((node, index, nodes) => ({
+    name: node.node,
     node: index,
     left: nodes.findIndex((n) => n.node === node.left),
     right: nodes.findIndex((n) => n.node === node.right),
   }));
 
-const targetNumber = lines.findIndex((line) => line.startsWith("ZZZ"));
-let currentNumber = lines.findIndex((line) => line.startsWith("AAA"));
-
-let steps = 0;
-while (currentNumber !== targetNumber) {
-  const direction = (
-    {
-      L: "left",
-      R: "right",
-    } as const
-  )[directions[steps % directions.length]];
-  if (!direction) throw new Error("Invalid direction");
-
-  currentNumber = nodes[currentNumber][direction];
-  steps++;
-}
+const [startingNodes, terminalNodes] = ["A", "Z"].map((char) =>
+  nodes.filter((n) => n.name.endsWith(char)).map((n) => n.node),
+);
+
+const result = startingNodes
+  .map((node) => {
+    let steps = 0;
+    while (!terminalNodes.includes(node)) {
+      const direction = (
+        {
+          L: "left",
+          R: "right",
+        } as const
+      )[directions[steps % directions.length]];
+      if (!direction) throw new Error("Invalid direction");
+
+      node = nodes[node][direction];
+      steps++;
+    }
+    return steps;
+  })
+  .reduce((acc, x) => lcm(acc, x), 1);
 
-console.log({ steps });
+console.log({ result });
-- 
cgit v1.2.3