首页 > 解决方案 > 序列的运行长度编码

问题描述

所以我试图解决这个问题,这是我想出的代码:

首先我有一个打包函数,接收一个列表并将相同的元素分组到一个向量中。

(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

有什么方法可以修复我的代码或更有效地解决问题但仍返回向量?

标签: clojure

解决方案


juxt可以在pack函数中使用:

(defn pack [xs]
  (map (juxt count first) (partition-by identity xs)))

(defn unpack [xs]
  (mapcat #(apply repeat %) xs))

推荐阅读