Files
advent-of-code-2025/clojure/src/question_4.clj
T

44 lines
1.5 KiB
Clojure

(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)))