From 2c026e06a3466ea5aba498636a9d07b5ccc434f5 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Mon, 13 Dec 2021 14:54:54 -0500 Subject: [PATCH] day2: revisit, make good --- day2/part1.clj | 37 ++++++++++++++++--------------------- day2/part2.clj | 37 ++++++++++++++++--------------------- 2 files changed, 32 insertions(+), 42 deletions(-) diff --git a/day2/part1.clj b/day2/part1.clj index d301b37..65a287a 100644 --- a/day2/part1.clj +++ b/day2/part1.clj @@ -1,4 +1,4 @@ -; Day 2, part 2 +; Day 2, part 1 ; Read a list of instructions from stdin: ; "down X" increases depth number by X, ; "up X" decreases depth by X, @@ -8,24 +8,19 @@ (require '[clojure.string :as str]) -(loop [data {:xpos 0 :depth 0}] - (let [input (read-line)] - (if (empty? input) - (println (apply * (vals data))) - (let [ins (str/split input #" ") - n (Integer/parseInt (second ins)) - ] - (recur - (apply (partial update-in data) - (case (first ins) - "forward" [[:xpos] + n] - "up" [[:depth] - n] - "down" [[:depth] + n] - ) - ) - ) - ) - ) - ) - ) +(println + (keduce * + (vals + (reduce + #(case (first %2) + "forward" (update %1 :xpos + (second %2)) + "up" (update %1 :depth - (second %2)) + "down" (update %1 :depth + (second %2)) + ) + {:xpos 0 :depth 0} + (->> (slurp "./in") + str/split-lines + (map #(str/split % #" ")) + (map #(update % 1 read-string)) + ))))) diff --git a/day2/part2.clj b/day2/part2.clj index 7eeeb21..9487a49 100644 --- a/day2/part2.clj +++ b/day2/part2.clj @@ -8,25 +8,20 @@ (require '[clojure.string :as str]) -(loop [data {:xpos 0 :depth 0 :aim 0}] - (let [input (read-line)] - (if (empty? input) - (println (apply * (map data [:xpos :depth]))) - (let [ins (str/split input #" ") - n (Integer/parseInt (second ins)) - ] - (recur - (case (first ins) - "forward" (-> data - (update-in [:xpos] + n) - (update-in [:depth] + (* (data :aim) n)) - ) - "up" (update-in data [:aim] - n) - "down" (update-in data [:aim] + n) - ) - ) - ) - ) - ) - ) +(println + (apply * + (map + (reduce + #(case (first %2) + "forward" (-> %1 (update :xpos + (second %2)) + (update :depth + (* (%1 :aim) (second %2)))) + "up" (update %1 :aim - (second %2)) + "down" (update %1 :aim + (second %2))) + {:xpos 0 :depth 0 :aim 0} + (->> (slurp "./in") + str/split-lines + (map #(str/split % #" ")) + (map #(update % 1 read-string)))) + [:xpos :depth] + )))