feat: added day 4... that one was easy

This commit is contained in:
didier committed 2025-12-04 08:16:09 -05:00
1 parent 065bd83312
commit 747fb07143
2 files changed
+184 -1

No files matched your search

+43
View File
@@ -0,0 +1,43 @@
(ns question-4
(:require [inputs]
[clojure.set]
[clojure.string :as strings]))
(def mock-input "..@@.@@@@.\n@@@.@.@.@@\n@@@@@.@.@@\n@.@@@@..@.\n@@.@@@@.@@\n.@@@@@@@.@\n.@.@.@.@@@\n@.@@@.@@@@\n.@@@@@@@@.\n@.@.@@@.@.")
(defn parse-input [document]
(let [x (map vec (strings/split-lines document))]
(apply hash-set (for [[line-idx line] (map-indexed vector x)
[col-idx e] (map-indexed vector line)
:when (= e \@)] [line-idx col-idx]))))
(defn neighbourhood [[row col]]
(for [delta-row [-1 0 1]
delta-col [-1 0 1]
:when (not= 0 delta-row delta-col)]
[(+ delta-row row) (+ col delta-col)]))
(defn accessible? [roll all-rolls]
(< (count (filter #(contains? all-rolls %) (neighbourhood roll))) 4))
(defn how-many-accessible [all-rolls]
(count (filter #(accessible? % all-rolls) all-rolls)))
(defn remove-all [all-rolls]
(let [to-remove (filter #(accessible? % all-rolls) all-rolls)]
(if (empty? to-remove)
all-rolls
(recur (clojure.set/difference all-rolls to-remove)))))
(defn question-4-a [document]
(-> document parse-input how-many-accessible))
(defn question-4-b [document]
(let [all-rolls (parse-input document)
final-rolls (remove-all all-rolls)]
(- (count all-rolls) (count final-rolls))))
(defn -main [& args]
(println "Solution to question 4-a is: " (question-4-a inputs/question-4))
(println "Solution to question 4-b is: " (question-4-b inputs/question-4)))