, , , , .
def divide_up(arr)
sz = arr.size
return nil if [0,1,2,5].include?(sz)
n3, d = sz.divmod(3)
return arr.each_slice(3).to_a if d.zero?
return arr.each_slice(4).to_a if d==n3
n3 -= d
arr[0,3*n3].each_slice(3).to_a + arr[3*n3..-1].each_slice(4).to_a
end
d==n3 (d==1 && n3==1) || (d==2 && n3==2).
< >
16.times do |n|
arr = [*1..n]
puts "for: #{arr}:"
a=divide_up(arr)
puts " #{(a ? a : "No solution")}"
end
#=> for: []:
# No solution
# for: [1]:
# No solution
# for: [1, 2]:
# No solution
# for: [1, 2, 3]:
# [[1, 2, 3]]
# for: [1, 2, 3, 4]:
# [[1, 2, 3, 4]]
# for: [1, 2, 3, 4, 5]:
# No solution
# for: [1, 2, 3, 4, 5, 6]:
# [[1, 2, 3], [4, 5, 6]]
# for: [1, 2, 3, 4, 5, 6, 7]:
# [[1, 2, 3], [4, 5, 6, 7]]
# for: [1, 2, 3, 4, 5, 6, 7, 8]:
# [[1, 2, 3, 4], [5, 6, 7, 8]]
# for: [1, 2, 3, 4, 5, 6, 7, 8, 9]:
# [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# for: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
# [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
# for: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]:
# [[1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
# for: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]:
# [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
# for: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]:
# [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12, 13]]
# for: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]:
# [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10], [11, 12, 13, 14]]
# for: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]:
# [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]]