2016-07-08 3 views
-1

2つの配列を正確に交互に挿入することなくインターリーブしたいと思います。例えば、与えられた:2つのルビ配列を不等にインターリーブする

a = [1,2,3,4,5,6,7,8,9] 
b = ['a','b','c'] 

私は出力としてf = [1,2,'a',3,4,'b',5,6,'c',7,8,9]受信したいと思います。私はaの2つの要素ごとに1つの要素をbにします。

a = [1,2,3,4,5,6,7,8,9] 
b = ['a','b','c'] 

even, odd = a.partition.each_with_index{ |_, i| i.even? } 
res = even.zip(odd,b) 
res = res.flatten.reject(&:blank?) 
#=> [1, 2, "a", 3, 4, "b", 5, 6, "c", 7, 8, 9] 

が、私は、このソリューションで興奮していないよ:

ソリューションがあるように思われます。何か案は?

+0

具体的には、正確に1:2の長さの配列に対する回答が必要でしたか?または、より一般的な答え、つまり任意の長さの2つの配列が必要でしたか? – sawa

+0

任意の長さにしてください! –

+0

これは私が最初に考えていたものです。それは私の答えだけに適しています。 – sawa

答えて

4
a.each_slice(2).zip(b).flatten 
#=> [1, 2, "a", 3, 4, "b", 5, 6, "c"] 
+0

[動作しません](https://repl.it/CaAq/4) – potashin

+0

いずれかの配列に余分な要素がある場合の望ましい動作は定義されていません。だから私はそれが完全に機能すると同じように主張することができます。いずれにせよ、downvoteはちょっと過酷だとは思わない? :) –

+0

問題の精緻化はあいまいかもしれませんが、OPの望む結果と投稿した結果は、あなたのコードが生成する結果と一致しません。それは確かです.-その結果、downvoteは正当化されています。違反はありません。 – potashin

0

あなたは(あなたが提供してきたことを、両方の例については)次のことを試すことができます。

b.zip(a.each_slice(2)).map(&:reverse).flatten 
# => [1, 2, "a", 3, 4, "b", 5, 6, "c"] 

Demonstration

0

これは(b.size > a.sizeを含む)任意のサイズの配列abのために働きますマージされた配列内のaからの要素のシーケンスの長さが最大でも1つだけ異なることを保証します。同じことが、の配列の場合にも当てはまる。b.size > a.size

def insert_em(a,b) 
    b.size <= a.size ? recurse(a,b) : recurse(b,a) 
end 

def recurse(a,b) 
    i = a.size/(b.size+1) 
    b.size == 1 ? a[0,i] + b + a[i..-1] : 
    [*a[0,i], b.first].concat(recurse(a[i..-1], b[1..-1])) 
end 

a = [1,2,3,4,5,6,7,8,9] 

insert_em a, ['a'] 
    #=> [1, 2, 3, 4, "a", 5, 6, 7, 8, 9] 
insert_em a, ['a','b'] 
    #=> [1, 2, 3, "a", 4, 5, 6, "b", 7, 8, 9] 
insert_em a, ['a','b','c'] 
    #=> [1, 2, "a", 3, 4, "b", 5, 6, "c", 7, 8, 9] 
insert_em a, ['a','b','c','d'] 
    #=> [1, "a", 2, 3, "b", 4, 5, "c", 6, 7, "d", 8, 9] 
insert_em a, ['a','b','c','d','e'] 
    #=> [1, "a", 2, "b", 3, "c", 4, 5, "d", 6, 7, "e", 8, 9] 
insert_em a, ['a','b','c','d','e','f'] 
    #=> [1, "a", 2, "b", 3, "c", 4, "d", 5, "e", 6, 7, "f", 8, 9] 
insert_em a, ['a','b','c','d','e','f','g'] 
    #=> [1, "a", 2, "b", 3, "c", 4, "d", 5, "e", 6, "f", 7, "g", 8, 9] 
insert_em a, ['a','b','c','d','e','f','g','i'] 
    #=> [1, "a", 2, "b", 3, "c", 4, "d", 5, "e", 6, "f", 7, "g", 8, "i", 9] 
insert_em a, ['a','b','c','d','e','f','g','i','j'] 
    #=> ["a", 1, "b", 2, "c", 3, "d", 4, "e", 5, "f", 6, "g", 7, "i", 8, "j", 9] 
insert_em a, ['a','b','c','d','e','f','g','i','j','k'] 
    #=> ["a", 1, "b", 2, "c", 3, "d", 4, "e", 5, "f", 6, "g", 7, "i", 8, "j", 9, "k"] 
insert_em a, ['a','b','c','d','e','f','g','i','j','k','l'] 
    #=> ["a", 1, "b", 2, "c", 3, "d", 4, "e", 5, "f", 6, "g", 7, "i", 8, "j", 9, "k", "l"] 
関連する問題