From 2441c6e83817ce81f250f943ea252f866957bee8 Mon Sep 17 00:00:00 2001 From: Jack Kinsey Date: Thu, 12 Dec 2019 11:36:41 -0500 Subject: [PATCH] Add untested day12pt1 --- src/adventofcode2019/core.clj | 6 ++--- src/adventofcode2019/day12.clj | 48 ++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 src/adventofcode2019/day12.clj diff --git a/src/adventofcode2019/core.clj b/src/adventofcode2019/core.clj index 9b83815..c2d5b25 100644 --- a/src/adventofcode2019/core.clj +++ b/src/adventofcode2019/core.clj @@ -1,7 +1,7 @@ (ns adventofcode2019.core - [:require (adventofcode2019 day01 day02 day03 day04 - day05 day06 day07 day08 - day09 day10 day11)]) + [:require (adventofcode2019 day01 day02 day03 day04 day05 + day06 day07 day08 day09 day10 + day11 day12)]) (defn -main ([] 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))) -- 2.26.2