迭代Clojure向量

时间:2017-11-26 09:33:38

标签: loops vector collections clojure

我正在实现一个Clojure函数(gol [coll]),它接收一个相同大小的向量向量1和0,迭代它检查每个索引的近位置并返回一个新的板;类似康威的生命游戏

输入:

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

输出:

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

如何迭代矢量并同时更改值?

1 个答案:

答案 0 :(得分:2)

使用assoc-in

(assoc-in v [0 0] 1)

以上将左上角值设为1

要一次设置多个,您可以减少超过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] ...]

要从输入转到输出,转换将是:

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