clojure - 循环移位嵌套向量

标签 clojure clojure-contrib

给定一个嵌套向量 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/

相关文章:

Clojure-为什么这段代码不能在 clojure 中工作,我是否缺少一些惰性求值陷阱?

clojure - 在 clojure 宏中评估符号的正确方法

Clojure : "java.lang.IllegalArgumentException: No value supplied for key:" when I changed require

regex - Clojure 中的多个正则表达式

json - 如何扩展 clojure.contribs json writer 以序列化其他类

java - Clojure Lein 类路径问题

clojure - 在 Common Lisp 中调用函数列表

clojure - 将 clojure.contrib.strint 与其他地方定义的字符串一起使用

clojure - 一种收集 Clojure Let 表达式的所有绑定(bind)的方法

Clojure db-do-prepared 调用多个参数