【发布时间】:2016-06-10 18:38:26
【问题描述】:
我想创建一个散列映射,其中包含 n 个键值对,这些键值对以 3 个为一组创建,其中集合确实不相交,例如[(34 false) (35 false) (36 false)] && [(24 false) (25 false) (26 false)] -> {34 false 35 false 36 false 24 false 25 false 26 false}
编辑:
为了玩/练习 Clojure,我正在尝试实现战舰棋盘游戏的惯用版本。我决定将战舰坐标存储在哈希图中,其中键是坐标,值是布尔值,指示该船的该部分是否已被击中。下面的具体代码是 supposed 到
- 选择一个轴(水平或垂直)
- 选择船头坐标
- 通过相应地增加 x 或 y 值来“建造”船的其余部分(总共 3 个坐标),例如{“10”假“11”假“12”假}。请注意,“10”转换为矩阵的第二行,第一列。
- 注意:在将船添加到坐标哈希图之前,必须检查新的船坐标以确保不存在交点。如果是这样,这艘船必须“重建”。
为此,我创建了以下代码。它有两个问题:
-
执行该函数会导致使用“acc”累加器出现以下异常:
clojure.lang.LazySeq 不能转换为 clojure.lang.Associative
函数的结果不是单个哈希映射,而是n个哈希映射的列表
使用惯用的 clojure,我怎样才能实现我的目标?
(defn launch
[n]
(loop [cnt n acc {}]
(if (= cnt 0)
acc
(recur
(- cnt 1)
((fn []
(let [axis (rand-int 2)]
(if (= axis 0)
(let [x (rand-int 8) y (rand-int 10)]
(for [k (range 3)]
(assoc acc (str y (+ x k)) false)))
(let [x (rand-int 10) y (rand-int 8)]
(for [k (range 3)]
(assoc acc (str (+ y k) x) false)))))))))))
【问题讨论】:
标签: clojure