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

64b490fe11342e5662f54a9e20483fad?d=identicon&s=25 Michal Gabrukiewicz (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
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2008-01-07 14:58
(Received via mailing list)
Attachment: smime.p7s (4 KB)
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
E3ba60e3dcb813f8abcd7732350e74cf?d=identicon&s=25 Phillip Koebbe (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
64b490fe11342e5662f54a9e20483fad?d=identicon&s=25 Michal Gabrukiewicz (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
E3ba60e3dcb813f8abcd7732350e74cf?d=identicon&s=25 Phillip Koebbe (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
81b61875e41eaa58887543635d556fca?d=identicon&s=25 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
A2b44c8642e3ea600a65305cec47bc32?d=identicon&s=25 Morgan Christiansson (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.
5f94b9b346c2aa648a80bc259978e5bc?d=identicon&s=25 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
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.