Fork me on GitHub
#clojure-italy
<
2017-08-15
>
reborg13:08:48

Data la seguente struttura dati contenente un stato del gioco del tris, qual e' secondo voi il modo piu' elegante di verificare se :x o :o ha vinto?

(def game [[nil :o   :x] 
           [nil :x   :o] 
           [:x  nil nil]])

reborg14:08:42

Non sono particolarmente contento:

(defn row [game x] (map #((game x) %) [0 1 2]))
(defn column [game y] (map #((game %) y) [0 1 2]))
(defn diag1 [game] (map (fn [[x y]] ((game x) y)) [[0 0] [1 1] [2 2]]))
(defn diag2 [game] (map (fn [[x y]] ((game x) y)) [[0 2] [1 1] [2 0]]))
(defn all [game] (concat (map (partial row game) [0 1 2]) (map (partial column game) [0 1 2]) [(diag1 game) (diag2 game)]))
(defn win? [s triplets] (some true? (map (partial apply = s) triplets)))

(win? :x (all game))
true

(win? :o (all game))
nil

richiardiandrea14:08:14

beh non male dai, volevo suggerire lo stesso, mi piacciono i diag

reborg14:08:37

si puo' fare... ma sembra cosi' tanto codice...

reborg14:08:22

Posso eliminare row/column con (defn all [game] (concat game (apply map vector game) [(diag1 game) (diag2 game)]))