2012-07-19 62 views
2

我需要一個函數來計算序列中連續相等條目的數量。例如,(連續的「abcdefg」)應該返回0,而(連續的「aabcdddefg」)應該返回3.Clojure:連續重複項的數量

是我寫它的習慣用法還是可以改進?

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

回答

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)成語時,需要一些連續序列。

1

試試這個。

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

這是常見的模式

5

我認爲(consecutive "abcdefg")應該返回1,不是0

這裏有一個簡單的實現,實現了這一點:

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

爲什麼要'(連續的「ABCDEFG 「)'返回1?你能否詳細說明一下? – 2012-07-19 15:29:04

+1

因爲最長的連續字符序列是長度爲1(單個字符)。在這種情況下強迫結果爲零似乎邏輯上不一致。我認爲唯一的情況是你有零個連續的字符是一個空字符串。 – mikera 2012-07-19 16:24:56