You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.4 KiB
Clojure
45 lines
1.4 KiB
Clojure
(require '[clojure.string :as str])
|
|
|
|
(defn pad-input-map [in-map pad-val]
|
|
(let [pad-row (repeat (+ 4 (count (first in-map))) pad-val)
|
|
pad-side (repeat 2 pad-val)]
|
|
(mapv vec
|
|
(concat
|
|
[pad-row pad-row]
|
|
(mapv #(concat pad-side % pad-side) in-map)
|
|
[pad-row pad-row]))))
|
|
|
|
(defn get-number [in-map y x]
|
|
(concat (subvec (get in-map (dec y)) (dec x) (+ 2 x))
|
|
(subvec (get in-map y) (dec x) (+ 2 x))
|
|
(subvec (get in-map (inc y)) (dec x) (+ 2 x))))
|
|
|
|
(defn get-new-pixel [enhance-algo in-map y x]
|
|
(->> (get-number in-map y x)
|
|
str/join
|
|
(#(Integer/parseInt % 2))
|
|
(get enhance-algo)
|
|
{\. 0 \# 1}))
|
|
|
|
(defn build-output-number-map [enhance-algo in-map]
|
|
(let [pad-val (if (= \# (first enhance-algo)) (first (first in-map)) 0)
|
|
padded-in-map (pad-input-map in-map pad-val)]
|
|
(for [y (range 1 (dec (count padded-in-map)))]
|
|
(for [x (range 1 (dec (count (first padded-in-map))))]
|
|
(get-new-pixel enhance-algo padded-in-map y x)
|
|
))))
|
|
|
|
(defn count-lit-pixels [in-map]
|
|
((frequencies (flatten in-map)) 1))
|
|
|
|
(let [[enhance-algo in-map]
|
|
(->> (slurp "./in")
|
|
str/split-lines
|
|
((juxt
|
|
first
|
|
(comp (partial mapv #(mapv {\. 0 \# 1} %))
|
|
(partial drop 2)))))
|
|
image-output (iterate (partial build-output-number-map enhance-algo) in-map)]
|
|
(println (count-lit-pixels (nth image-output 50))))
|
|
|