-; 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,
(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))
+ )))))
(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]
+ )))