planimule
planimule

Reputation: 11

Iterate Clojure vectors

I am implementing a Clojure function (gol [coll]) that receives a vector of vectors of the same size with 1 and 0, iterates it checking the near positions of each index and returns a new board; something like Conway’s Game of Life

Input:

`(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]])`

Output:

`[[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]]`

How can I iterate the vectors and change the values at the same time?

Upvotes: 1

Views: 124

Answers (1)

Chris Murphy
Chris Murphy

Reputation: 6509

Use assoc-in:

(assoc-in v [0 0] 1)

The above will set the top left value to 1.

To set many at once you can reduce over assoc-in.

(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] ...]

To go from your input to your output the transform would be:

[[[2 1] 0]
 [[2 3] 0]
 [[1 2] 1]
 [[3 2] 1]]

Upvotes: 2

Related Questions