2011-06-19 7 views
1

複数のベクターがある場合、1つのエレメントで重複する新しいベクターを作成するにはどうすればよいですか?例えば クロージャーで重複するベクターを作成する

、与えられたこれらのベクター:結果のはベクトルを重複

[1 1 1] [2 2 2] [3 3 3] 

は次のようになります

[1 1 1 2] 
     [1 2 2 2 3] 
       [2 3 3 3] 

答えて

2

私の戦略は次のようになります

  • は、ベクトルの3つのシーケンスを作成し、各オフセット1(前後)
  • マップtこれらの3つのシーケンスで、前と後のベクトルの最後と最初の要素を現在のベクトルのすべてと連結します。

コードは開始条件と終了条件を処理する必要があるために少し複雑ですが

(def vectors [[1 1 1] [2 2 2] [3 3 3]]) 

    (map 
    #(concat 
     (if (last %1) [(last %1)] []) 
     %2 
     (if (first %3) [(first %3)] [])) 
    (cons nil (butlast vectors)) 
    vectors 
    (concat (rest vectors) [nil])) 

    => ((1 1 1 2) (1 2 2 2 3) (2 3 3 3)) 
+0

作品、ありがとう! – jhickner

1

再帰的な実装::のようなもので

(defn overlap [colls] 
    (loop [ret [] prefix [] x (first colls) colls (next colls)] 
    (if colls 
     (recur (conj ret (concat prefix x [(ffirst colls)])) [(last x)] (first colls) (next colls)) 
     (conj ret (concat prefix x))))) 
関連する問題