给定一个嵌套向量 A
[[1 2 3] [4 5 6] [7 8 9]]
我的目标是循环移动行和列。
如果我首先考虑单行移位,我会期望
[[7 8 9] [1 2 3] [4 5 6]]
在这种情况下,第三行映射到第一行。
这是通过代码实现的
(defn circles [x i j]
(swap-rows x i j))
有输入
(circles [[1 2 3] [4 5 6] [7 8 9]] 0 1)
但是,我不确定如何进一步移动列。理想情况下,我想添加到函数圈并能够移动行或列。虽然我不确定对于每个类次选择是否只有两个不同的功能是最简单的。
最佳答案
(defn circles [xs i j]
(letfn [(shift [v n]
(let [n (- (count v) n)]
(vec (concat (subvec v n) (subvec v 0 n)))))]
(let [ys (map #(shift % i) xs)
j (- (count xs) j)]
(vec (concat (drop j ys) (take j ys))))))
例子:
(circles [[1 2 3] [4 5 6] [7 8 9]] 1 1)
;= [[9 7 8] [3 1 2] [6 4 5]]
根据您希望执行此操作的频率、输入向量的大小和要应用的移位,使用 core.rrb-vector可能是有道理的。 clojure.core.rrb-vector/catvec
是相关函数(您也可以使用 clojure.core.rrb-vector/subvec
进行切片,但实际上这里可以使用来自 clojure.core
的常规 subvec
,因为 catvec
将执行自己的转换)。
关于clojure - 循环移位嵌套向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20805978/