Forum: Ruby on Rails nice way to split an array into 3 equally sized pieces

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
D9231a4625c7921f7d393d30129f5f6d?d=identicon&s=25 Michal G. (gabru)
on 2008-01-07 14:18
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
Frederick Cheung (Guest)
on 2008-01-07 14:58
(Received via mailing list)
On 7 Jan 2008, at 13:18, Michal Gabrukiewicz 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, 2*length], array[2*length,
3*length]]
end


Fred
D46dd740e7b242ce769949d9d15bedf2?d=identicon&s=25 Phillip K. (pkoebbe)
on 2008-01-07 15:17
(Received via mailing list)
On Jan 7, 2008, at 7:18 AM, Michal Gabrukiewicz 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
D9231a4625c7921f7d393d30129f5f6d?d=identicon&s=25 Michal G. (gabru)
on 2008-01-07 16:42
Phillip Koebbe wrote:
> On Jan 7, 2008, at 7:18 AM, Michal Gabrukiewicz 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
D46dd740e7b242ce769949d9d15bedf2?d=identicon&s=25 Phillip K. (pkoebbe)
on 2008-01-07 18:32
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
Frederick Cheung (Guest)
on 2008-01-07 18:47
(Received via mailing list)
On 7 Jan 2008, at 15:42, Michal Gabrukiewicz 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 :-)

Fred
34d9a9e9fa226354438d3ca0805886d9?d=identicon&s=25 Morgan C. (mog)
on 2009-10-03 22:18
>> [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.
Colin Law (Guest)
on 2009-10-03 22:26
(Received via mailing list)
2009/10/3 Morgan Christiansson <rails-mailing-list@andreas-s.net>:
>
>>> [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
This topic is locked and can not be replied to.