Tal vez estoy leyendo mal la questi ya que la otra respuesta ya está aceptada, pero sonaba como si quisieras dividir la matriz en 3 grupos iguales, independientemente del tamaño de cada grupo, en lugar de dividirla en N grupos de 3 como lo hacen las respuestas anteriores. Si eso es lo que está buscando, rieles (ActiveSupport) también tiene un método llamado in_groups:
a = [0,1,2,3,4,5,6]
a.in_groups(2) # => [[0,1,2,3],[4,5,6,nil]]
a.in_groups(3, false) # => [[0,1,2],[3,4], [5,6]]
No creo que hay un rubí equivalente, sin embargo, se puede obtener aproximadamente los mismos resultados mediante la adición de este método sencillo:
class Array; def in_groups(num_groups)
return [] if num_groups == 0
slice_size = (self.size/Float(num_groups)).ceil
groups = self.each_slice(slice_size).to_a
end; end
a.in_groups(3) # => [[0,1,2], [3,4,5], [6]]
la única diferencia (como se puede ver) es que esto no va a difundir el "espacio vacío" en todos los grupos; cada grupo, pero el último es igual en tamaño, y el último grupo siempre contiene el resto más todo el "espacio vacío".
Actualización: Como @rimsky astutamente señaló, el método anterior no siempre resultan en el número correcto de los grupos (a veces se crearán varias "grupos vacías" al final, y dejarlos fuera). Aquí hay una versión actualizada, reducida desde ActiveSupport's definition que extiende los extras para completar el número solicitado de grupos.
def in_groups(number)
group_size = size/number
leftovers = size % number
groups = []
start = 0
number.times do |index|
length = group_size + (leftovers > 0 && leftovers > index ? 1 : 0)
groups << slice(start, length)
start += length
end
groups
end
posible duplicado de [¿Cómo dividir (trozo) una matriz de rubíes en partes de los elementos de X?] (Http://stackoverflow.com/questions/2699584/how-to-split-chunk-a-ruby -array-into-parts-of-x-elements) –
Desafortunadamente, el ejemplo elegido tiene el mismo resultado para "dividir en 3 grupos" y "dividir en grupos de 3 elementos", por eso tienes dos respuestas completamente diferentes. – tokland