我需要一个函数来计算序列中连续相等条目的数量。例如,(连续的“abcdefg”)应该返回0,而(连续的“aabcdddefg”)应该返回3.
我写的方式是惯用还是可以改进?
(defn consecutive [p]
(second (reduce
#(vector %2
(if (= (first %1) %2)
(inc (second %1))
(second %1)))
[nil 0]
p)))
答案 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)))
这是常见模式