分割されるシーケンスは asplittee
であり、分割ポイント (別名splitter
) の要素は分割の最後の要素をマークします。
あなたの例から:
スプリット:[1 2 3 4 5 6]
スプリッター:[3 5]
結果:((1 2 3)(4 5)(6))
結果のパーティションは常に増加する整数シーケンスであり、 の増加する整数シーケンスはx
として定義できるため、スプリッター要素は、定義に従ってシーケンスの にstart <= x < end
変換できます。end
したがって、 から[3 5]
と で終わるサブシーケンスを見つけたいと思い4
ます6
。
次に を追加することstart
で、を のsplitter
シーケンスに変換できます[start end]
。Splitteeのstart
andend
も使用されます。
したがって、スプリッターは次のように[3 5]
なります。
[[1 4] [4 6] [6 7]]
スプリッタ変換はこのように行うことができます
(->> (concat [(first splittee)]
(mapcat (juxt inc inc) splitter)
[(inc (last splittee))])
(partition 2)
splitter
変換された結果と望ましい結果との間には見事な対称性があります。
[[1 4] [4 6] [6 7]]
((1 2 3) (4 5) (6))
次に問題は、変換されたスプリッター内splittee
で範囲指定されたサブシーケンスを抽出する方法になります。[start end]
clojure には、ordered sequence byおよびcriteriasubseq
内のサブシーケンスを見つけるために使用できる関数があります。変換されたスプリッターの各要素に対して、splittee の subseq をマップするだけです。start
end
(map (fn [[x y]]
(subseq (apply sorted-set splittee) <= x < y))
transformed-splitter)
上記の手順を組み合わせることで、私の答えは次のとおりです。
(defn partition-by-seq
[splitter splittee]
(->> (concat [(first splittee)]
(mapcat (juxt inc inc) splitter)
[(inc (last splittee))])
(partition 2)
(map (fn [[x y]]
(subseq (apply sorted-set splittee) <= x < y)))))