bbiker wrote:
> bbiker wrote:
> > I believe the OP asked how to split an array in "x" sub arrays of equal
> > length.
> > To me, it appears that the response show how to partition an array into
> > sub arrays of "y" elements.
> >
> > The following method does what the OP asked for, as far as I read it.
> >
> > class Array
> > 	def split(n, b=[], d=[])
> > 		#########################################################################
> > 		# evenly split array 'a' into 'n' sub arrays
> > 		#########################################################################
> > 		if self.size == 0 or n <= 0
> >     	b = nil
> > 		elsif n == 1
> >     	b = *self
> > 		else
> > 			# determine how many elements of the array should go in each sub
> > arrays
> > 			buckets = n
> > 			length = self.size
> > 			while buckets > 0
> > 				elements = length / buckets + (length % buckets > 0 ? 1 : 0)
> > 				d << elements
> > 				length -= elements
> > 				buckets -= 1
> > 			end
> > 			# p d
> >
> > 			# evenly distribute array elements into an array with 'n' sub arrays
> > 			start = 0  # start
> > 			0.upto(n-1) do |idx|
> > 				len = d[idx]
> > 				b[idx] = *self.slice(start,len)
> > 				start += len
> > 			end
> > 		end
> > 		b
> > 	end
> > end
>
> Sorry, but I pressed the Post message button too soon.
>
> c =
> [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23].split(5)
> =>
>
> [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18,
> 19], [20, 21, 22, 23]]
>
> Note that the first 3 sub arrays contain 5 elements and the last 2 sub
> arrays contain 4 elements.
>
> I am a Ruby newbie and would appreciate a critique on the method I
> posted.
>
> Thank You

class Array
  def split n
    count , fat_ones = self.size / n , self.size % n
    self.inject( [[]] ){ |a,e|
      a.last.size < count + ( a.size <= fat_ones ? 1 : 0 ) ?
        a.last << e  :  a << [e] ;  a }
  end
end

a = (1..23).to_a
p a.split(5)
p a