nice way to split an array into 3 equally sized pieces

before i start writing my own sophisticated small algorithm i thought i
ask you guys how to do this in a rails way ..

given array:
a = [1, 2, 3, 4, 5, 6, 7]

out of this array i need an array b holding three elements where each of
them holds the same size of elements ... if not possible then the last
one should hold less .. so for the above it would be

b = [[1, 2, 3], [4, 5, 6], [7]]

another example:
a = [1, 2] => b = [[1], [2], []]

thanks for the simplest way

Well not massively nice but

def split(array)
   length = (array.length / 3.0).ceil
   [array[0, length], array[length, 2*length], array[2*length, 3*length]]
end

Fred

in_groups_of

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

a.in_groups_of(3)

[[1,2,3], [4,5,6], [7,nil,nil]]

or

a.in_groups_of(3, false)

[[1,2,3], [4,5,6], [7]]

Peace,
Phillip

Michal Gabrukiewicz wrote:

thanks philip but this does it exactly the other way round .. fred's
version is fine but it was a bit buggy .. this works fine

  #splits an array into 3 equal parts
  def split_array(array)
    length = (array.length / 3.0).ceil
    [array[0, length], array[length, length], array[2 * length, length]]
  end

You know, if I had been paying attention, I would have done two things
differently:

1) ran your second example
2) noticed that Fred did *not* suggest in_groups_of

Either one of those would have been sufficient to tell me that my idea
was not correct.

<crawling back into his cave>

Peace,
Phillip

Oops, I obviously went on crack when I typed it into my mail client :slight_smile:

Fred

[1, 2, 3, 4, 5, 6, 7].in_groups(3)

=> [[1, 2, 3], [4, 5, nil], [6, 7, nil]]

Note that the in_groups takes 1 from each of the last 2 columns instead
of 2 from the last.

That is as documented, you want in_groups_of

Colin