diff options
author | Clyne Sullivan <clyne@bitgloo.com> | 2022-11-30 19:55:31 -0500 |
---|---|---|
committer | Clyne Sullivan <clyne@bitgloo.com> | 2022-11-30 19:55:31 -0500 |
commit | 8d43e37df99f280377bed90284d6ac2428334804 (patch) | |
tree | 3a5042c9af29da52b4bac38fd78b3ccde77a1dbc /day19/partboth.clj | |
parent | 66ed0b9d27850dc653abc8baa75884f3de311bfa (diff) |
move 2021 days to folder; update README
Diffstat (limited to 'day19/partboth.clj')
-rw-r--r-- | day19/partboth.clj | 98 |
1 files changed, 0 insertions, 98 deletions
diff --git a/day19/partboth.clj b/day19/partboth.clj deleted file mode 100644 index 48f1a9c..0000000 --- a/day19/partboth.clj +++ /dev/null @@ -1,98 +0,0 @@ -(require '[clojure.core.reducers :as r]) -(require 'clojure.string) - -(def orientation-vectors - [[[1 0 0] [0 1 0] [0 0 1]] - [[1 0 0] [0 0 -1] [0 1 0]] - [[1 0 0] [0 -1 0] [0 0 -1]] - [[1 0 0] [0 0 1] [0 -1 0]] - [[-1 0 0] [0 -1 0] [0 0 1]] - [[-1 0 0] [0 0 -1] [0 -1 0]] - [[-1 0 0] [0 1 0] [0 0 -1]] - [[-1 0 0] [0 0 1] [0 1 0]] - [[0 0 -1] [1 0 0] [0 -1 0]] - [[0 1 0] [1 0 0] [0 0 -1]] - [[0 0 1] [1 0 0] [0 1 0]] - [[0 -1 0] [1 0 0] [0 0 1]] - [[0 0 1] [-1 0 0] [0 -1 0]] - [[0 1 0] [-1 0 0] [0 0 1]] - [[0 0 -1] [-1 0 0] [0 1 0]] - [[0 -1 0] [-1 0 0] [0 0 -1]] - [[0 -1 0] [0 0 -1] [1 0 0]] - [[0 0 1] [0 -1 0] [1 0 0]] - [[0 1 0] [0 0 1] [1 0 0]] - [[0 0 -1] [0 1 0] [1 0 0]] - [[0 0 1] [0 1 0] [-1 0 0]] - [[0 -1 0] [0 0 1] [-1 0 0]] - [[0 0 -1] [0 -1 0] [-1 0 0]] - [[0 1 0] [0 0 -1] [-1 0 0]]]) - -(defn build-scanner-reports - "Splits slurped, split-line'd input by scanner." - [input-lines] - (loop [scanners [] rem-input input-lines] - (if (empty? rem-input) - scanners - (let [[this nxt] (split-with (comp not empty?) rem-input)] - (recur (->> (rest this) - (map #(read-string (clojure.string/join ["[" % "]"]))) - (conj scanners)) - (rest nxt)))))) - -(defn point-add [[a b c] [d e f]] [(+ a d) (+ b e) (+ c f)]) - -(defn orient [[x y z] [[a b c] [d e f] [g h i]]] - [(+ (* x a) (* y d) (* z g)) (+ (* x b) (* y e) (* z h)) (+ (* x c) (* y f) (* z i))]) - -(defn scanner-orientation [report or-index] - (map #(orient (map - %) (get orientation-vectors or-index)) report)) - -(defn scanner-orientations - "Builds list of scanner reports adjusted for all possible orientations." - [report] - (for [or-vec orientation-vectors] - (map #(orient (map - %) or-vec) report))) - -(defn scanner-build-potential-links - "Builds a list for each s2 orientation that contains lists of each s1 point - added to the corresponding s2 point." - [s1 s2] - (for [s2-or (scanner-orientations s2)] - (for [i (range 0 (count s1))] - (for [j (range 0 (count s2-or))] - (point-add (nth s1 i) (nth s2-or j)))))) - -(defn scanner-find-connection - "Attempt to determine if s1 and s2 are linked through common beacons." - [s1 s2] - (loop [potential-links (as-> (scanner-build-potential-links s1 s2) $ - (for [i (range 0 (count $))] [i (nth $ i)]) - (into [] $))] - (when-let [[orientation link] (first potential-links)] - (if-let [match (first (drop-while #(< (val %) 12) (frequencies (reduce concat link))))] - [orientation (key match)] - (recur (rest potential-links)))))) - -(defn scanner-merge - "Merges the report of linked scanner s2 into scanner s1." - [s1 s2 s2-or s2-coord] - (vec (into (set s1) (map #(point-add s2-coord (map - %)) (scanner-orientation s2 s2-or))))) - -(let [[beacon-count scanner-coords] - (loop [new-reps (->> (slurp "./in") clojure.string/split-lines build-scanner-reports) - sc-coords '([0 0 0]) - next-reps (rest new-reps)] - (if-let [next-rep (first next-reps)] - (if-let [[found-or found-coord] (scanner-find-connection (first new-reps) next-rep)] - (let [new-base (scanner-merge (first new-reps) next-rep found-or found-coord) - newest-reps (->> (assoc new-reps 0 new-base) (filterv (partial not= next-rep)))] - (println "found" found-coord) - (recur newest-reps (conj sc-coords found-coord) (rest newest-reps))) - (recur new-reps sc-coords (rest next-reps))) - [(count (first new-reps)) sc-coords]))] - (println "Part 1:" beacon-count) - (println "Part 2:" - (apply max - (for [p1 scanner-coords p2 scanner-coords :when (not= p1 p2)] - (apply + (map #(Math/abs %) (point-add (map - p1) p2))))))) - |