44 lines
1.5 KiB
Clojure
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)))
|
|
|
|
|