Advertisement
Guest User

Untitled

a guest
Dec 12th, 2015
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (fn gol [input]
  2.   (let [b ((comp dec count) input)
  3.         r ((comp dec count) (first input))
  4.         board (->> input
  5.                    (map seq)
  6.                    (map #(replace {\space :dead \# :live} %))
  7.                    (mapv (partial into [])))
  8.         neighbors (fn [[i j]]
  9.                     (into [] (for [i' [(dec i) i (inc i)]
  10.                                    j' [(dec j) j (inc j)]
  11.                                    :when (and (<= 0 i' b) (<= 0 j' r) (not= [i j] [i' j']))]
  12.                                [i' j'])))
  13.         next-state (fn [[status neighbors]]
  14.                      (let [live-neighbors (->> (map (fn [[i j]]
  15.                                                       (nth (nth board i) j)) neighbors)
  16.                                                (filter (partial = :live))
  17.                                                count)]
  18.                        (if (= status :live)
  19.                          (cond (< live-neighbors 2) " "
  20.                                (<= 2 live-neighbors 3) "#"
  21.                                :else " ")
  22.                          (cond (= live-neighbors 3) "#"
  23.                                :else " "))))]
  24.     (->> board
  25.          (map-indexed (fn [i row] (map-indexed (fn [j elem] [elem [i j]]) row)))
  26.          (map (partial map #(vector (first %) (neighbors (last %)))))
  27.          (map (partial map next-state))
  28.          (mapv clojure.string/join))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement