From 4c101f2afa735b60a0f714ad9751997fa4ca4b45 Mon Sep 17 00:00:00 2001 From: ajet Date: Sun, 7 Dec 2025 20:22:59 -1000 Subject: [PATCH] do day 8 --- 2025/src/day08.clj | 58 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 2025/src/day08.clj diff --git a/2025/src/day08.clj b/2025/src/day08.clj new file mode 100644 index 0000000..a909c63 --- /dev/null +++ b/2025/src/day08.clj @@ -0,0 +1,58 @@ +(ns day08 + (:require input-manager clojure.set + [clojure.string :as str])) + +(def input (->> (input-manager/get-input 2025 8) + (mapv (comp (partial mapv parse-long) + (partial re-seq #"\d+"))))) +(def circuits (into #{} (map hash-set input))) + +(defn square [x] (* x x)) +(defn dist-squared [[ax ay az] [bx by bz]] + (+ (square (- ax bx)) + (square (- ay by)) + (square (- az bz)))) +(def closest-points + (->> (for [a input + b input + :when (not= a b)] + #{a b}) + distinct + (map vec) + (sort-by (partial apply dist-squared)))) + +(->> closest-points + (take (count input)) + (reduce (fn [circuits [a b]] + (let [circuit-a (first (filter #(% a) circuits)) + circuit-b (first (filter #(% b) circuits))] + (if (= circuit-a circuit-b) + circuits + (let [combined (clojure.set/union circuit-a circuit-b)] + (-> circuits + (disj circuit-a) + (disj circuit-b) + (conj combined)))))) + circuits) + (sort-by count) + (take-last 3) + (map count) + (apply *)) + +(->> (loop [circuits circuits + [[a b] & rst] (take 10000 closest-points)] + (let [circuit-a (first (filter #(% a) circuits)) + circuit-b (first (filter #(% b) circuits))] + (if (= circuit-a circuit-b) + (recur circuits rst) + (let [combined (clojure.set/union circuit-a circuit-b) + circuits' (-> circuits + (disj circuit-a) + (disj circuit-b) + (conj combined))] + (if (= 1 (count circuits')) + [a b] + (recur circuits' rst)))))) + (map first) + (apply *)) +