If I want to interleave a set of arrays in Ruby, and each array was the same length, we could do so as:
a.zip(b).zip(c).flatten
However, how do we solve this problem if the arrays can be different sizes?
We could do something like:
def interleave(*args)
raise 'No arrays to interleave' if args.empty?
max_length = args.inject(0) { |length, elem| length = [length, elem.length].max }
output = Array.new
for i in 0...max_length
args.each { |elem|
output << elem[i] if i < elem.length
}
end
return output
end
But is there a better ‘Ruby’ way, perhaps using zip or transpose or some such?
If the source arrays don’t have
nilin them, you only need to extend the first array withnils, zip will automatically pad the others withnil. This also means you get to usecompactto clean the extra entries out which is hopefully more efficient than explicit loopsHere is a slightly more complicated version that works if the arrays do contain
nil