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