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

On 7 Jan 2008, at 13:18, Michal G. wrote:

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], []]

Well not massively nice but

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

Fred

On Jan 7, 2008, at 7:18 AM, Michal G. wrote:

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

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

Phillip K. wrote:

On Jan 7, 2008, at 7:18 AM, Michal G. wrote:

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

in_groups_of

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

On 7 Jan 2008, at 15:42, Michal G. wrote:

another example:

#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

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.

Michal G. 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.

Peace,
Phillip

2009/10/3 Morgan C. [email protected]:

[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