Clojure:连续重复项的数量

时间:2012-07-19 12:52:48

标签: clojure

我需要一个函数来计算序列中连续相等条目的数量。例如,(连续的“abcdefg”)应该返回0,而(连续的“aabcdddefg”)应该返回3.

我写的方式是惯用还是可以改进?

(defn consecutive [p]
  (second (reduce
            #(vector %2
                     (if (= (first %1) %2)
                       (inc (second %1))
                       (second %1)))
            [nil 0]
            p)))

3 个答案:

答案 0 :(得分:5)

我认为(consecutive "abcdefg")应该返回1而不是0。

这是一个实现此目的的简单实现:

(defn consecutive [s] 
  (apply max (map count (partition-by identity s))))

答案 1 :(得分:4)

user> (defn consecutive [s] (->> s (partition-by identity) (reduce #(+ % (dec (count %2))) 0)))
#'user/consecutive
user> (consecutive "abcdefg")
0
user> (consecutive "aabcdddefg")
3

当需要一些连续的序列时,我更喜欢(partition-by identity)习语。

答案 2 :(得分:1)

试试这个。

(defn consecutive [string]
  (let [n (apply max (map count (partition-by identity string)))]
    (if (= n 1) 0 n)))

这是常见模式