Forum: Ruby single to multi dimension array conversion

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.
Ashik A. (Guest)
on 2009-04-13 14:57
Can any one tell me converting single to multi dimension array
conversion

For example ,
     a = [ 1,2,3,4,5,6,7,8,9,10 ]
     a.<methodName>( 2,3 )

      Output,



here ,
     2 means dimension No
     3 means elements in each dimension
Ashik A. (Guest)
on 2009-04-13 14:59
Ashikali A. wrote:
> Can any one tell me converting single to multi dimension array
> conversion
>
> For example ,
>      a = [ 1,2,3,4,5,6,7,8,9,10 ]
>      a.<methodName>( 2,3 )
>
>       Output,
>
>
>
> here ,
>      2 means dimension No
>      3 means elements in each dimension


In above example output should be ,
   a = [ [1,2,3],[4,5,6],[7,8,9] , [ 10 ] ]
James C. (Guest)
on 2009-04-13 15:26
(Received via mailing list)
2009/4/13 Ashikali A. <removed_email_address@domain.invalid>

> >
> >
> > here ,
> >      2 means dimension No
> >      3 means elements in each dimension
>
>
> In above example output should be ,
>   a = [ [1,2,3],[4,5,6],[7,8,9] , [ 10 ] ]


That has more than three elements along the outermost direction. It
represents the matrix:

1  2  3
4  5  6
7  8  9
10

So you can't fit the data into a 3x3 space. You might need to specify
the
problem a bit more carefully.
James C. (Guest)
on 2009-04-13 15:46
(Received via mailing list)
2009/4/13 James C. <removed_email_address@domain.invalid>

> > >       Output,
>
>
> That has more than three elements along the outermost direction. It
> represents the matrix:
>
> 1  2  3
> 4  5  6
> 7  8  9
> 10
>

Although, here's one possible and slightly more general solution:

class Array
  def multidim(*sizes)
    split = sizes.inject { |a,b| a * b }
    return self unless split
    result = []
    each_slice(split) { |slice| result << slice.multidim(*sizes[1..-1])
}
    result
  end
end

With this, you specify how many you want in each dimension, so:

[1,2,3,4,5,6,7,8,9,10].multidim(3)
#=> [[1,2,3],[4,5,6],[7,8,9],[10]]

It works from the outside in, so for higher dimensions it works like
this:

[1,2,3,4,5,6,7,8,9,10].multidim(3,2)
#=> [ [ [1, 2],
        [3, 4],
        [5, 6]
      ],
      [ [7, 8],
        [9, 10]
    ] ]
This topic is locked and can not be replied to.