3

長さ n の 2 つのベクトルを入力する関数を作成しようとしています。

すなわち [:a :b :c :d :e :f] [1 2 3 4 5 6]。長さ 2n のベクトルを 1 つ出力する

[:a 1 :b 2 :c 3 :d 4 :e 5 :f 6]。

ただし、入力される 2 番目のベクトルが n の長さと一致しない場合は循環します。

すなわち [:a :b :c :d :e :f] [1 2 3]

出力: [:a 1 :b 2 :c 3 :d 1 :e 2 :f 3]。

 (defn Swanson [x y] (vec (flatten (interleave x (repeat (count x) y)))))

さらに、この関数は [xy min max n] を取ることもできます。ここで、x と y はベクトル、min はインターリービングを開始するインデックス、max はインターリービングを終了するインデックス、n はインターリービングのステップ サイズです。

4

4 に答える 4

1

2 つの任意のサイズのベクトルの場合:

(defn cycleave [a b] 
  (let [c (max (count a) (count b))] 
    (take (* 2 c) (interleave (cycle a) 
                              (cycle b)))))

あげる:

user => (cycleave [:a :b :c :d :e :f] [1 2 3])
(:a 1 :b 2 :c 3 :d 1 :e 2 :f 3)
于 2013-11-19T20:37:09.463 に答える
1

そのために、seq ライブラリの interleave 関数を使用できます。

=> (interleave [:a :b :c :d :e :f] [1 2 3 4 5 6])
(:a 1 :b 2 :c 3 :d 4 :e 5 :f 6)

お役に立てれば!

于 2013-11-19T19:56:00.947 に答える
1

x および y ベクトルの場合、min は (包括的) 開始インデックス、max は (排他的) 終了インデックス、n はステップ サイズです。

(defn swanson [x y min max n]
  (->> (interleave x (cycle y))
       (take max)
       (drop min)
       (take-nth n)))
于 2013-11-29T03:56:50.550 に答える