序列的运行长度编码
所以我试图解决这个问题,这是我想出的代码:
首先我有一个包函数,接收一个列表并将相同的元素分组到一个向量中。
(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))