X-Git-Url: http://git.jkinsey.net/?p=adventofcode2019.git;a=blobdiff_plain;f=src%2Fadventofcode2019%2Fday12.clj;fp=src%2Fadventofcode2019%2Fday12.clj;h=acf3ff60024e989c585f889d1442222d90d3e58b;hp=d10e74b514cf7d427c7571a086cfc8f5d56b7ee0;hb=297bfc51cea8986dc780a44595eb02e08e5e387c;hpb=0449019578dbfc4c0b280578cb9e48d5bb1e1079 diff --git a/src/adventofcode2019/day12.clj b/src/adventofcode2019/day12.clj index d10e74b..acf3ff6 100644 --- a/src/adventofcode2019/day12.clj +++ b/src/adventofcode2019/day12.clj @@ -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]]) ; -> [[1 2 3] [0 0 0]] (defn parse-coords [coords] @@ -41,16 +41,22 @@ (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))))