diff --git a/2017/src/day03.clj b/2017/src/day03.clj new file mode 100644 index 0000000..14a9585 --- /dev/null +++ b/2017/src/day03.clj @@ -0,0 +1,51 @@ +(ns day03 + (:require input-manager)) + +(def input (parse-long (input-manager/get-input-raw 2017 3))) + +(def directions [:right :up :left :down]) +(def to-the-left {:right :up + :up :left + :down :right + :left :down}) +(def cardinal-dir-offsets {:right [1 0] + :left [-1 0] + :down [0 -1] + :up [0 1]}) + +(def all-offsets #{[1 0] [-1 0] [0 -1] [0 1] [1 1] [-1 -1] [1 -1] [-1 1]}) + +(->> (loop [loc [1 0] + i 2 + grid {[0 0] 1} + [dir :as dirs] (cycle directions)] + (if (< i input) + (let [left-loc (mapv + loc (cardinal-dir-offsets (to-the-left dir))) + grid' (assoc grid loc i) + i' (inc i)] + (if (contains? grid left-loc) + (recur (mapv + loc (cardinal-dir-offsets dir)) i' grid' dirs) + (recur left-loc i' grid' (rest dirs)))) + loc)) + (map abs) + (apply +)) + +(->> (loop [loc [1 0] + grid {[0 0] 1} + [dir :as dirs] (cycle directions)] + (let [left-loc (mapv + loc (cardinal-dir-offsets (to-the-left dir))) + value (->> all-offsets + (map (comp + #(or (grid %) 0) + #(mapv + % loc))) + (reduce +)) + grid' (assoc grid loc value)] + (cond + (> value input) + value + + (contains? grid left-loc) + (recur (mapv + loc (cardinal-dir-offsets dir)) grid' dirs) + + :else + (recur left-loc grid' (rest dirs))))))