clojure - 序列的运行长度编码
问题描述
所以我试图解决这个问题,这是我想出的代码:
首先我有一个打包函数,接收一个列表并将相同的元素分组到一个向量中。
(defn pack [lst]
(def a [])
(def vect [])
(cond
(empty? lst)
lst
:else
(loop [i 0]
(def r (get lst i))
(def t (get lst (+ i 1)))
(if (= r t)
(def vect (conj vect r))
)
(if (not= r t)
(and (def vect (conj vect r)) (and (def a (conj a vect)) (def vect [])))
)
(if (= i (- (count lst) 1))
a
(recur (inc i))
)
))
)
例如,如果我有这个向量:
(def tes '[a a a a b c c a a d e e e e])
pack 函数将返回:
[[a a a a] [b] [c c] [a a] [d] [e e e e]]
然后我尝试用这段代码做问题的“编码”部分:
(def v1 [])
(def v2 [])
(conj v2 (conj v1 (count (get (pack tes) 0)) (get (get (pack tes) 0) 0)))
它返回了我想要的东西,一个向量“v2”和一个向量“v1”,其中包含“编码”项。
[[4 a]]
所以现在我尝试制作这个功能:
(defn encode [lst]
(loop [index 0 limit (count (pack lst)) v1 [] v2[]]
(if (= index limit)
lst
(conj v2 (conj v1 (count (get (pack tes) index)) (get (get (pack tes) index) index)))
)
(recur (inc index) limit v1 v2)
)
)
(encode tes)
但我收到此错误:
2021/03/07 00:00:21 got exception from server /usr/local/bin/lein: line 152:
28 Killed "$LEIN_JAVA_CMD" "${BOOTCLASSPATH[@]}" -Dfile.encoding=UTF-8 -Dmaven.wagon.http.ssl.easy=false -Dmaven.wagon.rto=10000 $LEIN_JVM_OPTS
-Dleiningen.original.pwd="$ORIGINAL_PWD" -Dleiningen.script="$0" -classpath "$CLASSPATH" clojure.main -m leiningen.core.main "$@"
2021/03/07 01:42:20 error reading from server EOF
有什么方法可以修复我的代码或更有效地解决问题但仍返回向量?
解决方案
juxt
可以在pack
函数中使用:
(defn pack [xs]
(map (juxt count first) (partition-by identity xs)))
(defn unpack [xs]
(mapcat #(apply repeat %) xs))
推荐阅读
- python - 使用根记录器禁用来自导入模块的日志
- python - 'Line 2D' 对象没有属性 'kind' -- pyplot.plot() 和 .plot() 不同吗?
- android - 用谷歌地图规划路线
- c++ - 在数字右侧使用左移运算符
- java - 使用 Gradle 将目录压缩到多个目的地
- api - 如何将 API 输出数据保存到 Azure 数据工厂中的数据集
- c - 我在 scanf 中的输入不起作用,返回进程并且我没有得到任何输出
- admob - Admob 上的应用打开广告 - 测试广告上没有广告配置
- python - 对数组的每个元素执行相同操作的最快方法
- ios - 自定义 XCFramework 的消费者如何访问标头文档?