From 68c02872a81d598b5067200854f9c46fd9f06876 Mon Sep 17 00:00:00 2001
From: Clyne Sullivan <clyne@bitgloo.com>
Date: Sun, 5 Dec 2021 10:23:12 -0500
Subject: day5: learned update and reduce

---
 day5/part1.clj | 60 ++++++++++++++++++++++------------------------------------
 day5/part2.clj | 60 ++++++++++++++++++++++------------------------------------
 2 files changed, 46 insertions(+), 74 deletions(-)

diff --git a/day5/part1.clj b/day5/part1.clj
index 02eb846..95d04ba 100644
--- a/day5/part1.clj
+++ b/day5/part1.clj
@@ -14,45 +14,35 @@
     )
   )
 
-(defn mark-coord [cmap x y]
-  (vec
-    (for [c (range 0 (count cmap))]
-      (if (= c y)
-        (vec
-          (for [r (range 0 (count cmap))]
-            (if (= r x)
-              (inc (get (get cmap c) r))
-              (get (get cmap c) r)
-              )
-            )
-          )
-        (get cmap c)
+(defn read-all-coords []
+  (loop [cds [] c (read-coords)]
+    (if (empty? c)
+      cds
+      (recur
+        (conj cds c)
+        (read-coords)
         )
       )
     )
   )
 
+(defn mark-coord [cmap x y]
+  (update cmap y #(update % x inc))
+  )
+
 (defn mark-coords [cmap x1 y1 x2 y2]
   (cond
     (= y1 y2)
-    (loop [cm cmap x (range (min x1 x2) (inc (max x1 x2)))]
-      (if (empty? x)
-        cm
-        (recur
-          (mark-coord cm (first x) y1)
-          (rest x)
-          )
-        )
+    (reduce
+      #(mark-coord %1 %2 y1)
+      cmap
+      (range (min x1 x2) (inc (max x1 x2)))
       )
     (= x1 x2)
-    (loop [cm cmap y (range (min y1 y2) (inc (max y1 y2)))]
-      (if (empty? y)
-        cm
-        (recur
-          (mark-coord cm x1 (first y))
-          (rest y)
-          )
-        )
+    (reduce
+      #(mark-coord %1 x1 %2)
+      cmap
+      (range (min y1 y2) (inc (max y1 y2)))
       )
     :else
     cmap
@@ -68,14 +58,10 @@
   )
 
 (def finished-map
-  (loop [cmap (empty-map) coord (read-coords)]
-    (if (empty? coord)
-      cmap
-      (recur
-        (apply (partial mark-coords cmap) coord)
-        (read-coords)
-        )
-      )
+  (reduce
+    #(apply (partial mark-coords %1) %2)
+    (empty-map)
+    (read-all-coords)
     )
   )
 
diff --git a/day5/part2.clj b/day5/part2.clj
index af63683..c374716 100644
--- a/day5/part2.clj
+++ b/day5/part2.clj
@@ -14,45 +14,35 @@
     )
   )
 
-(defn mark-coord [cmap x y]
-  (vec
-    (for [c (range 0 (count cmap))]
-      (if (= c y)
-        (vec
-          (for [r (range 0 (count cmap))]
-            (if (= r x)
-              (inc (get (get cmap c) r))
-              (get (get cmap c) r)
-              )
-            )
-          )
-        (get cmap c)
+(defn read-all-coords []
+  (loop [cds [] c (read-coords)]
+    (if (empty? c)
+      cds
+      (recur
+        (conj cds c)
+        (read-coords)
         )
       )
     )
   )
 
+(defn mark-coord [cmap x y]
+  (update cmap y #(update % x inc))
+  )
+
 (defn mark-coords [cmap x1 y1 x2 y2]
   (cond
     (= y1 y2)
-    (loop [cm cmap x (range (min x1 x2) (inc (max x1 x2)))]
-      (if (empty? x)
-        cm
-        (recur
-          (mark-coord cm (first x) y1)
-          (rest x)
-          )
-        )
+    (reduce
+      #(mark-coord %1 %2 y1)
+      cmap
+      (range (min x1 x2) (inc (max x1 x2)))
       )
     (= x1 x2)
-    (loop [cm cmap y (range (min y1 y2) (inc (max y1 y2)))]
-      (if (empty? y)
-        cm
-        (recur
-          (mark-coord cm x1 (first y))
-          (rest y)
-          )
-        )
+    (reduce
+      #(mark-coord %1 x1 %2)
+      cmap
+      (range (min y1 y2) (inc (max y1 y2)))
       )
     :else
     (let [ic (if (< x1 x2) [x1 y1] [x2 y2])
@@ -81,14 +71,10 @@
   )
 
 (def finished-map
-  (loop [cmap (empty-map) coord (read-coords)]
-    (if (empty? coord)
-      cmap
-      (recur
-        (apply (partial mark-coords cmap) coord)
-        (read-coords)
-        )
-      )
+  (reduce
+    #(apply (partial mark-coords %1) %2)
+    (empty-map)
+    (read-all-coords)
     )
   )
 
-- 
cgit v1.2.3