]> code.bitgloo.com Git - clyne/advent-of-code.git/commitdiff
add day 4
authorClyne Sullivan <clyne@bitgloo.com>
Sun, 5 Dec 2021 00:53:16 +0000 (19:53 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Sun, 5 Dec 2021 00:53:16 +0000 (19:53 -0500)
day4/part1.clj [new file with mode: 0644]
day4/part2.clj [new file with mode: 0644]

diff --git a/day4/part1.clj b/day4/part1.clj
new file mode 100644 (file)
index 0000000..eddebe6
--- /dev/null
@@ -0,0 +1,84 @@
+(require '[clojure.string :as str])
+
+(def calls
+  (map
+    #(Integer/parseInt %)
+    (-> (read-line)
+        (str/split #",")
+        )
+    )
+  )
+
+;(println calls)
+
+(defn read-board []
+  (when (not (nil? (read-line)))
+    (vec
+    (for [x (range 0 5)]
+      (-> (read-line)
+          (concat " ")
+          (str/join)
+          (str/trim)
+          (str/split #"\s+")
+          (#(map (fn [l] (Integer/parseInt l)) %))
+          )
+      ))
+    )
+  )
+
+(defn bingo-row? [row]
+  (every? nil? row)
+  )
+
+(defn bingo? [board]
+  (not
+    (nil?
+      (some
+        bingo-row?
+        (concat
+          board
+          (apply mapv vector board)
+          )
+        )
+      )
+    )
+  )
+
+(defn get-bingo [_board]
+  (loop
+    [board _board nums calls turns 1]
+    (let [new-board (vec (for [r (range 0 5)]
+                      (replace {(first nums) nil} (get board r))))]
+      (if (bingo? new-board)
+        [new-board (first nums) turns]
+        (recur new-board (rest nums) (inc turns))
+        )
+      )
+    )
+  )
+
+(def best (atom [999 0]))
+
+(loop [board (read-board)]
+  (when (not (nil? board))
+    (let [bingo (get-bingo board)]
+      (when (< (get bingo 2) (first @best))
+        (reset! best
+                [(get bingo 2)
+                 (*
+                  (second bingo)
+                  (->> (first bingo)
+                       (flatten)
+                       (filter some?)
+                       (apply +)
+                       )
+                  )]
+                )
+        )
+      )
+    (recur (read-board))
+    )
+  )
+
+(println @best)
+
diff --git a/day4/part2.clj b/day4/part2.clj
new file mode 100644 (file)
index 0000000..e90137d
--- /dev/null
@@ -0,0 +1,82 @@
+(require '[clojure.string :as str])
+
+(def calls
+  (map
+    #(Integer/parseInt %)
+    (-> (read-line)
+        (str/split #",")
+        )
+    )
+  )
+
+(defn read-board []
+  (when (not (nil? (read-line)))
+    (vec
+    (for [x (range 0 5)]
+      (-> (read-line)
+          (concat " ")
+          (str/join)
+          (str/trim)
+          (str/split #"\s+")
+          (#(map (fn [l] (Integer/parseInt l)) %))
+          )
+      ))
+    )
+  )
+
+(defn bingo-row? [row]
+  (every? nil? row)
+  )
+
+(defn bingo? [board]
+  (not
+    (nil?
+      (some
+        bingo-row?
+        (concat
+          board
+          (apply mapv vector board)
+          )
+        )
+      )
+    )
+  )
+
+(defn get-bingo [_board]
+  (loop
+    [board _board nums calls turns 1]
+    (let [new-board (vec (for [r (range 0 5)]
+                      (replace {(first nums) nil} (get board r))))]
+      (if (bingo? new-board)
+        [new-board (first nums) turns]
+        (recur new-board (rest nums) (inc turns))
+        )
+      )
+    )
+  )
+
+(def best (atom [0 0]))
+
+(loop [board (read-board)]
+  (when (not (nil? board))
+    (let [bingo (get-bingo board)]
+      (when (> (get bingo 2) (first @best))
+        (reset! best
+                [(get bingo 2)
+                 (*
+                  (second bingo)
+                  (->> (first bingo)
+                       (flatten)
+                       (filter some?)
+                       (apply +)
+                       )
+                  )]
+                )
+        )
+      )
+    (recur (read-board))
+    )
+  )
+
+(println @best)
+