diff --git a/.gitignore b/.gitignore index 79b9535b..64fd3c52 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ +/.idea/ +/*.iml /node_modules/ /release/ diff --git a/website/index/samples/sample.clojure.txt b/website/index/samples/sample.clojure.txt index 1dd486d5..d9de4831 100644 --- a/website/index/samples/sample.clojure.txt +++ b/website/index/samples/sample.clojure.txt @@ -1,8 +1,54 @@ -(def object "call object via def()") -(defn say-hello - "Takes name argument and say hello to the name" - [name] - (println (str "God said let there be " name))) -(let [l "light"] (println (str (say-hello l) " " object))) -(doc say-hello) -(meta (var say-hello)) +(ns game-of-life + "Conway's Game of Life, based on the work of + Christophe Grand (http://clj-me.cgrand.net/2011/08/19/conways-game-of-life) + and Laurent Petit (https://gist.github.com/1200343).") + +;;; Core game of life's algorithm functions + +(defn neighbors + "Given a cell's coordinates `[x y]`, returns the coordinates of its + neighbors." + [[x y]] + (for [dx [-1 0 1] + dy (if (zero? dx) + [-1 1] + [-1 0 1])] + [(+ dx x) (+ dy y)])) + +(defn step + "Given a set of living `cells`, computes the new set of living cells." + [cells] + (set (for [[cell n] (frequencies (mapcat neighbors cells)) + :when (or (= n 3) + (and (= n 2) + (cells cell)))] + cell))) + +;;; Utility methods for displaying game on a text terminal + +(defn print-grid + "Prints a `grid` of `w` columns and `h` rows, on *out*, representing a + step in the game." + [grid w h] + (doseq [x (range (inc w)) + y (range (inc h))] + (when (= y 0) (println)) + (print (if (grid [x y]) + "[X]" + " . ")))) + +(defn print-grids + "Prints a sequence of `grids` of `w` columns and `h` rows on *out*, + representing several steps." + [grids w h] + (doseq [grid grids] + (print-grid grid w h) + (println))) + +;;; Launches an example grid + +(def grid + "`grid` represents the initial set of living cells" + #{[2 1] [2 2] [2 3]}) + +(print-grids (take 3 (iterate step grid)) 5 5) \ No newline at end of file