2017-11-26 3 views
1

Ich implementiere eine Clojure-Funktion (gol [coll]), die einen Vektor von Vektoren der gleichen Größe mit 1 und 0 erhält, iteriert es überprüft die nahen Positionen jedes Index und gibt eine neue Platine; so etwas wie Conways Spiel des LebensIterate Clojure Vektoren

Eingang:

`(gol [[0 0 0 0 0] 
     [0 0 0 0 0] 
     [0 1 1 1 0] 
     [0 0 0 0 0] 
     [0 0 0 0 0]])` 

Ausgang:

`[[0 0 0 0 0] 
    [0 0 1 0 0] 
    [0 0 1 0 0] 
    [0 0 1 0 0] 
    [0 0 0 0 0]]` 

Wie kann ich die Vektoren durchlaufen und die Werte in der gleichen Zeit ändern?

Antwort

1

Verwendung assoc-in:

(assoc-in v [0 0] 1) 

Der oben wird den linken oberen Wert auf 1 gesetzt.

Um viele auf einmal zu setzen, können Sie über assoc-in reduzieren.

(def new-values [[[0 0] 1] 
       [[0 1] 2] 
       [[0 2] 3]]) 

(reduce 
    (fn [acc ele] 
    (apply assoc-in acc ele)) 
    v 
    new-values) 

;;=> [[1 2 3 0 0] ...] 

Um von Ihrer Eingabe in die Ausgabe gehen die wäre verwandeln:

[[[2 1] 0] 
[[2 3] 0] 
[[1 2] 1] 
[[3 2] 1]] 
Verwandte Themen