2

シーケンス内の連続した等しいエントリの数を計算する関数が必要です。たとえば、(連続する "abcdefg") は 0 を返し、(連続する "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")0 ではなく 1 を返すべきだと思います。

これを実現する簡単な実装を次に示します。

(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 に答える