2013-11-19 3 views
3

Ищу написать функцию, которая вводит два вектора длины п,Объединение векторов по индексу

т.е. [: A: B: C: D: E: F] [1 2 3 4 5 6]. Вывод одного вектора длины 2n

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

Однако, если второй вектор входного не соответствует длине п он будет цикл,

т.е. [: 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))))) 

Кроме того, функция может также принимать [х мин макс п], где х и у являются векторами, мин представляет собой индекс, чтобы начать перемежение, макс является индекс для завершения перемежения, и п представляет собой размер шага для чередования.

+3

Я бы сказал, что аргументы min/max/n не входят в эту функцию - они добавляют слишком много несвязанных обязанностей. Вместо этого используйте простую версию этой функции только с x/y и объедините take, drop и take-nth (или что-то - я не обработал детали). Затем, если вы хотите, вы можете создать еще одну функцию, которая принимает все пять аргументов и вызывает четыре соответствующие функции. – amalloy

ответ

1

С х и у векторов, мин (включительно), начиная index, max (исключающий) конечный индекс, n размер шага:

(defn swanson [x y min max n] 
    (->> (interleave x (cycle y)) 
     (take max) 
     (drop min) 
     (take-nth n))) 
1

Вы можете использовать функцию перемежения из библиотеки след за что:

=> (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) 

Надеется, что это помогает!

6

Вы хотите cycle:

user> (take 6 (cycle [1 2 3])) 
(1 2 3 1 2 3) 

user> (interleave [:a :b :c :d :e :f] (cycle [1 2 3])) 
(:a 1 :b 2 :c 3 :d 1 :e 2 :f 3) 
1

для двух любых векторов размера:

(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) 
+0

или если вы только заботитесь о том, как долго длится первая последовательность, вы можете просто выполнить команду '(defn cycleave [ab] (interleave a (цикл b))), которая остановится на' (* 2 (count a)) 'элементы – tolitius

+0

, если вы хотите вернуть только элементы' n': '(defn cycleave [abn] (принять n (чередование (цикл a) (цикл b))))' – tolitius

Смежные вопросы