clojure - 计算集合中元素的连续出现

标签 clojure nested-loops find-occurrences

得到这样的东西的惯用方式是什么?

(fn [coll] (function body) [1 0 -1 -1 -1 0 0 0 0 1 1 1 1 1 0 1 -1])
-> [1 1 3 2 1 4 3 2 1 5 4 3 2 1 1 1 1]

我只能以这种方式做。
(fn [coll] 
  (loop [i 0 r []]
    (if (< i (count coll))
      (let [elem (nth coll i)
            cc (loop [j 1]
                 (if (< (+ i j) (dec (count coll)))
                   (let [nelem (nth coll (+ i j))]
                     (if (= elem nelem)
                       (recur (inc j))
                       j))
                   j))]
        (recur (inc i) (conj r cc)))
      r)))

最佳答案

修改@noisesmith的简洁解决方案以解决我们认为的问题是:

(defn countdown-runs [s]
  (->> s
       (partition-by identity)
       (map count)
       (mapcat #(range % 0 -1))))

例如,
(countdown-runs [1 0 -1 -1 -1 0 0 0 0 1 1 1 1 1 0 1 -1])
; (1 1 3 2 1 4 3 2 1 5 4 3 2 1 1 1 1)

关于clojure - 计算集合中元素的连续出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23712800/

相关文章:

generics - 映射集合而不将它们转换为列表

sqlite - 如何使用 clojure.java.jdbc 插入包含时间戳值的行?

Python - 迭代复杂列表比嵌套 for 循环更好的方法

loops - 嵌套循环的复杂性

java - 像 Clojure 一样的类型化持久数据结构,用 Java 完成?

java - 如何使用swing和clojure做动画?

从内部 for 循环中断外部 for 循环的干净方法

php - 计算值的出现并将其作为value_name => occurrences对返回

python - 如何根据共现矩阵计算相似度?

r - 计算模式并区分它们