Array#collect_every is taken from:
http://redhanded.hobix.com/bits/matchingIntoMultipleAssignment.html
Author: Ezra Zygmuntowicz (in the comments)
class Array
def collect_every(n, fill=false, offset = 0)
if block_given?
while offset < size
ret = []
if fill
n.times do |x|
if offset + x > size - 1 then ret << nil
else ret << self[offset + x] end
end
else
n.times { |x| ret << self[offset + x] unless offset + x > size - 1}
end
offset += n
yield ret
ret = nil
end
else
ret = []
while offset < size
ret << []
if fill
n.times do |x|
if offset + x > size - 1 then ret.last << nil
else ret.last << self[offset + x]; end
end
else
n.times { |x| ret.last << self[offset + x] unless offset + x > size - 1 }
end
offset += n
end
return ret
end
end
end
a = (1..10).to_a
puts a.collect_every(5).inspect
a.collect_every(5) { |x| puts x.inspect }
puts a.collect_every(3, true).inspect
puts a.collect_every(3, true,1).inspect
puts a.collect_every(3, true,4).inspect
puts a.inspect
class Array
def subdivide(n)
return self if n <= 0 || n >= self.size
result = []
max_subarray_size = n - 1
while self.size > 0
result << self.slice!(0..max_subarray_size)
end
result
end
end
a = ('a'..'g').to_a
b = a.subdivide(3)
puts b.inspect
puts a.inspect