# Alternately taking elements from an array

Given the task of having to return an array that alternately takes elements from two arrays, what would be most Ruby way of completing the task? As of now, I have this code, but it doesn't feel very elegant.

def alternateTake (a, b)
raise ArgumentError, "Unequal length" if a.length != b.length
build = []
(0..a.length-1).each do |x|
build << (x.even? ? a[x] : b[x])
end
build
end


Example input & output:

method([1, 4, 3, 7], [1, 4, 2, 33]) = [1, 4, 3, 33]
method([98, 12, 41], [35, 22, 14]) = [98, 22, 41]
method([12, 33], [66, 45, 3]) = ERROR


This one-liner should be what you're looking for:

def alternate_take(xs, ys)
raise ArgumentError, "Unequal length" if xs.length != ys.length
xs.zip(ys).map.with_index{|(x,y),i| i.even? ? x : y}
end


def alternate_take(xs, ys)

• Looks good. Some details: maybe use unless instead of if, give plural names to a and b (maybe: xs, ys) and unpack the pair |(x, y), idx| ... – tokland May 16 '16 at 22:55
• @Michael. A lot of ways, for example: xs.zip(ys, [true, false].cycle).map { |x, y, take_x| take_x ? x : y }. Not that there is anything wrong with using with_index. – tokland May 16 '16 at 23:01