gpt4 book ai didi

algorithm - Clojure Group 连续出现 - 改进功能

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:43:07 26 4
gpt4 key购买 nike

我正在尝试对直接相邻出现的项目进行分组,只要它们都在给定的“白名单”中即可。分组必须至少包含两个或更多项目。

例如,第一个参数是集合,第二个参数是白名单。

(group-sequential [1 2 3 4 5] [2 3])
>> ((2 3))

(group-sequential ["The" "quick" "brown" "healthy" "fox" "jumped" "over" "the" "fence"]
["quick" "brown" "over" "fox" "jumped"])
>> (("quick" "brown") ("fox" "jumped" "over"))

(group-sequential [1 2 3 4 5 6 7] [2 3 6])
>> ((2 3))

这是我想出的:

(defn group-sequential
[haystack needles]
(loop [l haystack acc '()]
(let [[curr more] (split-with #(some #{%} needles) l)]
(if (< (count curr) 2)
(if (empty? more) acc (recur (rest more) acc))
(recur (rest more) (cons curr acc))))))

它有效,但非常丑陋。我想知道在 Clojure 中是否有更简单的惯用方法? (在我发现 split-with 之前你应该已经看过 fn :)

我打赌有一个很好的单行代码,带有 partition-by 之类的东西,但是已经晚了,我似乎无法让它工作。

最佳答案

(defn group-sequential [coll white] 
(->> coll
(map (set white))
(partition-by nil?)
(filter (comp first next))))

... Diego Basch's method 的更简洁版本.

关于algorithm - Clojure Group 连续出现 - 改进功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26352385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com