X-Git-Url: http://git.jkinsey.net/?p=adventofcode2019.git;a=blobdiff_plain;f=src%2Fadventofcode2019%2Fday12.clj;fp=src%2Fadventofcode2019%2Fday12.clj;h=28ad0b2783d56ae33132fd918c0077ff65c86f13;hp=0000000000000000000000000000000000000000;hb=2441c6e83817ce81f250f943ea252f866957bee8;hpb=9205379113b838bcad0f87d9dfa770fc7c3d0b83 diff --git a/src/adventofcode2019/day12.clj b/src/adventofcode2019/day12.clj new file mode 100644 index 0000000..28ad0b2 --- /dev/null +++ b/src/adventofcode2019/day12.clj @@ -0,0 +1,48 @@ +(ns adventofcode2019.day12 + [:require [adventofcode2019.lib :refer :all] + [adventofcode2019.intcode :as i] + [clojure.string :as str] + [clojure.core.match :refer [match]] + [clojure.math.combinatorics :as combo] + [clojure.pprint :refer [pprint]]]) + +; -> [[1 2 3] [0 0 0]] +(defn parse-coords [coords] + [(mapv parse-int (str/split (str/replace coords #"[<>xyz=,]" "") #" ")) + [0 0 0]]) + +(defn gravity [[pos1 vel1] [pos2 vel2]] + (let [adjust-velocity (fn [a b] + (cond + (< a b) [inc dec] + (= a b) [identity identity] + (> a b) [dec inc])) + velocity-diffs (map adjust-velocity pos1 pos2) + apply-diffs (fn [acc vel] (mapv #(%1 %2) (map acc velocity-diffs) vel))] + [(apply-diffs first vel1) + (apply-diffs second vel2)])) + +(defn velocity [[pos vel]] + [(mapv + pos vel) vel]) + +(defn total-energy [[pos vel]] + (let [abs+ (fn [& args] (apply + (map #(Math/abs %) args))) + potential (apply abs+ pos) + kinetic (apply abs+ vel)] + (* potential kinetic))) + +(defn step-simulation [bodies] + (let [indices (range (count bodies)) + all-pairs (combo/combinations indices 2) + apply-gravity (fn [bodies [i j]] + (let [[nv1 nv2] (gravity (bodies i) (bodies j))] + (-> bodies + (assoc-in [i 1] nv1) + (assoc-in [j 1] nv2))))] + (mapv velocity (reduce apply-gravity bodies all-pairs)))) + +(defn day12 [] + (let [input (map parse-coords (get-list-from-file (input-file))) + simulate (iterate step-simulation input)] + (part1 (reduce + (map total-energy (nth simulate 1000)))) + #_(part2)))