【发布时间】:2011-04-24 19:26:12
【问题描述】:
我正在尝试找到一种 Clojure 惯用的方法来“压缩”向量:
(shift-nils-left [:a :b :c :a nil :d nil])
;=> (true [nil nil :a :b :c :a :d])
(shift-nils-left [nil :a])
;=> (false [nil :a])
(shift-nils-left [:a nil])
;=> (true [nil :a])
(shift-nils-left [:a :b])
;=> (false [:a :b])
换句话说,我想将所有nil 值移动到向量的左端,而不改变长度。布尔值指示是否发生任何移位。 “外部”结构可以是任何seq,但内部结果应该是向量。
我怀疑该函数将涉及 filter(在 nil 值上)和 into 添加到与原始长度相同的 nils 向量中,但我不确定如何减少结果恢复到原来的长度。我知道如何做到这一点“长手”,但我怀疑 Clojure 将能够在一行中完成。
我正在考虑编写一个 Bejeweled 播放器作为学习 Clojure 的练习。
谢谢。
【问题讨论】:
-
如果您允许将值向右移动...
-
我想到的数据结构是一个向量或者8个向量。每个内部向量代表一列珠宝。
apply-move函数将用nil值替换消失的珠宝。然后,我将使用“压缩”功能将nil值移动到顶部,然后用珠宝重新填充(我已经有了这样做的功能)。
标签: clojure