2

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

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

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

3 回答 3

5

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

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

(defn consecutive [s] 
  (apply max (map count (partition-by identity s))))
于 2012-07-19T14:06:49.873 回答
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)当需要一些连续的序列时,我更喜欢这个成语。

于 2012-07-19T13:28:09.217 回答
1

试试这个。

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

这是常见的模式

于 2012-07-19T13:32:38.920 回答