Add correct day12pt2
[adventofcode2019.git] / src / adventofcode2019 / day12.clj
index d10e74b514cf7d427c7571a086cfc8f5d56b7ee0..acf3ff60024e989c585f889d1442222d90d3e58b 100644 (file)
@@ -4,7 +4,7 @@
    [clojure.string :as str]
    [clojure.core.match :refer [match]]
    [clojure.math.combinatorics :as combo]
-   [clojure.pprint :refer [pprint]]])
+   [clojure.math.numeric-tower :as math]])
 
 ; <x=1, y=2, z=3> -> [[1 2 3] [0 0 0]]
 (defn parse-coords [coords]
                               (assoc-in [j 1] nv2))))]
     (mapv velocity (reduce apply-gravity bodies all-pairs))))
 
-(defn find-cycle [states]
+(defn find-cycle [xs ys zs]
   (let [detect-dup (fn [[ct prev] state]
-                     (if (= (flatten prev)
-                            (map - (flatten state)))
-                       (reduced (inc ct))
-                       [(inc ct) state]))]
-    (* 2 (reduce detect-dup [0 []] states))))
+                       (if (prev state)
+                           (reduced ct)
+                           [(inc ct) (conj prev state)]))
+        dup-rep (partial reduce detect-dup [0 (hash-set)])]
+    (reduce math/lcm (map dup-rep [xs ys zs]))))
 
 (defn day12 []
   (let [input (mapv parse-coords (get-list-from-file (input-file)))
-        simulate (iterate step-simulation input)]
+        input-x (mapv (fn [[[p _ _] [v _ _]]] [[p] [v]]) input)
+        input-y (mapv (fn [[[_ p _] [_ v _]]] [[p] [v]]) input)
+        input-z (mapv (fn [[[_ _ p] [_ _ v]]] [[p] [v]]) input)
+        simulate (iterate step-simulation input)
+        simulate-x (iterate step-simulation input-x)
+        simulate-y (iterate step-simulation input-y)
+        simulate-z (iterate step-simulation input-z)]
     (part1 (reduce + (map total-energy (nth simulate 1000))))
-    (part2 (find-cycle simulate))))
+    (part2 (find-cycle simulate-x simulate-y simulate-z))))