Criação de duas matrizes a partir de elementos alternados de outra matriz.

Começando com esta matriz, de quantas maneiras diferentes você pode criar duas matrizes de cada outro elemento:

array = %w(key_a value_a key_b value_b key_c value_c)

1

hash = Hash[*array]
hash
.keys
hash
.values

2

Hash[*array].to_a.transpose

2b (Hash [] aceita uma matriz compactada, bem como uma sequência de argumentos.)

Hash[array.each_slice(2).to_a].to_a.transpose

3

array.each_slice(2).to_a.transpose

4

array.partition { |v| array.index(v).even? }

5

keys = []
values
= []
array
.each_slice(2) do |key, value|
keys
<< key
values
<< value
end

6

keys = []
values
= []
array
.each_index do |index|
if index.even?
keys
<< array[index]
else
values
<< array[index]
end
end

7

keys = []
values
= []
until array.empty?
keys
<< array.shift
values
<< array.shift
end

7b (praticamente a mesma coisa que o anterior)

collection = [Array.new, Array.new]
collection
.map! { |a| a << array.shift } until array.empty?

8

array.values_at *array.each_index.select(&:even?)
array
.values_at *array.each_index.select(&:odd?)

9 (ligeiramente diferente do anterior)

array.each_index.select(&:even?).map { |i| array[i] }
array
.each_index.select(&:odd?).map { |i| array[i] }

10

(0..(array.size - 1)).step(2).map { |i| array[i] }
(1..(array.size - 1)).step(2).map { |i| array[i] }

10b (praticamente a mesma coisa que o anterior)

2.times.map do |n|
(n..(array.size - 1)).step(2).map { |i| array[i] }
end

11 (um pouco estranho)

collection = { true => [], false => [] }
array
.each_index { |i| collection[i.even?] << array[i] }
collection
.values

Eu perdi alguma coisa?