Ruby -将用户数量分成大小为3、4或5的组

fkvaft9z  于 12个月前  发布在  Ruby
关注(0)|答案(1)|浏览(69)

我正在编写一个应用程序,要求我将给定数量的用户分为两个或更多个组,每个组包含3,4或5个用户。可以有任何数量的用户大于8。
例如,11个用户可以分为3个组,大小分别为4、4和3,我将指定为[4,4,3]。其他例子如下。

  • [3,3,3]对于9个用户
  • [5,5]供10名用户使用
  • [3,3,3,3] 12个用户
  • [5,4,3]供12名用户使用
  • [5,5,3]供13名用户使用
  • [5,5,4]供14名用户使用
  • [3,3,3,5]供14名用户使用
  • [5,5,5] 15个用户
  • [4,4,4,3] 15个用户

如何获得任意数量的用户组的集合,每组包含3、4或5个用户,使得组大小的总和等于给定的用户数量?

6bc51xsx

6bc51xsx1#

最小化组数

def groupem(n)
  raise ArgumentError if n < 9
  m = n/5
  case n%5
  when 0
    [5]*m
  when 1
    [5]*(m-1) << 3 << 3
  when 2
    [5]*(m-1) << 4 << 3
  when 3
    [5]*m << 3
  else # 4
    [5]*m << 4
  end
end
groupem(8)
  #=> ArgumentError

(9..20).each { |n| puts "#{n.to_s.rjust(2)} users: #{groupem(n)}" }
 9 users: [3, 3, 3]
10 users: [3, 3, 4]
11 users: [5, 3, 3]
12 users: [5, 4, 3]
13 users: [5, 5, 3]
14 users: [5, 5, 4]
15 users: [5, 5, 5]
16 users: [5, 5, 3, 3]
17 users: [5, 5, 4, 3]
18 users: [5, 5, 5, 3]
19 users: [5, 5, 5, 4]
20 users: [5, 5, 5, 5]

最大化组数

def groupem(n)
  raise ArgumentError if n < 9
  m = n/3
  case n%3
  when 0
    [3]*m
  when 1
    [3]*(m-1) << 4
  else # 2
    [3]*(m-1) << 5
  end
end
groupem(8)
  #=> ArgumentError

(9..20).each { |n| puts "#{n.to_s.rjust(2)} users: #{groupem(n)}" }
 9 users: [3, 3, 3]
10 users: [3, 3, 4]
11 users: [3, 3, 5]
12 users: [3, 3, 3, 3]
13 users: [3, 3, 3, 4]
14 users: [3, 3, 3, 5]
15 users: [3, 3, 3, 3, 3]
16 users: [3, 3, 3, 3, 4]
17 users: [3, 3, 3, 3, 5]
18 users: [3, 3, 3, 3, 3, 3]
19 users: [3, 3, 3, 3, 3, 4]
20 users: [3, 3, 3, 3, 3, 5]

相关问题