Clojure:从序列中查找顺序项

Ral*_*lph 6 reduce clojure

在Clojure程序中,我有一系列数字:

(2 3 4 6 8 1)
Run Code Online (Sandbox Code Playgroud)

我想找到项目顺序的最长子序列:

(2 3 4)
Run Code Online (Sandbox Code Playgroud)

我假设它将涉及(take-while ...)(reduce ...).

有任何想法吗?

澄清:我需要最长的连续项目列表.我更确定,更容易.感谢我解决我最初提出的更难的问题.

cgr*_*and 12

如果您只对最长的初始序列感兴趣,那么它是1-liner:

(defn longest-initial-sequence [[x :as s]]
  (take-while identity (map #(#{%1} %2) s (iterate inc x))))
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!看起来像APL没有有趣的unicode字符:-). (3认同)

Mic*_*zyk 5

考虑到OP对这个问题的评论 - 这完全改变了游戏! - 这可以写得非常简单:

(let [doubletons (partition 2 1 [1 2 3 5 6])
      increment? (fn increment? [[x y]]
                   (== (inc x) y))]
  (cons (ffirst doubletons)
        (map second (take-while increment? doubletons))))

;; returns (1 2 3)
Run Code Online (Sandbox Code Playgroud)

请注意,这实际上是懒惰的.我希望它不会doubletons让当地人清除感谢.另一个版本:

(cons (first [1 2 3 5 6])
      (map second (take-while increment? (partition 2 1 [1 2 3 5 6]))))
Run Code Online (Sandbox Code Playgroud)

不过,问题的原始版本更有趣!:-)可以使用上面的方法构建一个超级简单的解决方案,但是当然这将比使用的性能低得多reduce.我会看看我是否与zmila和dnolen的解决方案有很大的不同 - 但仍然合理地表现 - 稍后会添加到该线程的那一部分.(我猜不太可能.)