3

値のシーケンスに基づいて、シーケンスを分割したい

(partition-by-seq [3 5] [1 2 3 4 5 6]) 
((1 2 3)(4 5)(6))

最初の入力は一連の分割点です。2 番目の入力は、分割したい seq です。したがって、最初のリストは値 3 (1 2 3) で分割され、2 番目の分割は (4 5) になります。5 は次の分割ポイントです。

もう一つの例:

(partition-by-seq [3] [2 3 4 5])
result: ((2 3)(4 5))

(partition-by-seq [2 5] [2 3 5 6])
result: ((2)(3 5)(6))

与えられた: 最初の seq (分割点) は常に 2 番目の入力 seq のサブセットです。

4

3 に答える 3

1

分割されるシーケンスは 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のstartandendも使用されます。

したがって、スプリッターは次のように[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 をマップするだけです。startend

(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)))))
于 2015-03-17T17:17:36.380 に答える
0

これが私が思いついた解決策です。

(def a [1 2 3 4 5 6])
(def p [2 4 5])

(defn partition-by-seq [s input]
  (loop [i 0 
         t input
         v (transient [])]
    (if (< i (count s))
        (let [x (split-with #(<= % (nth s i)) t)]
          (recur (inc i) (first (rest x)) (conj! v (first x))))
      (do
        (conj! v t)
        (filter #(not= (count %) 0) (persistent! v))))))

(partition-by-seq p a)
于 2015-03-17T17:02:25.797 に答える