Ruby - ユーザーの数をサイズ 3、4、または 5 のグループに分割します。
概要
指定された数のユーザーを、それぞれ 3、4、または 5 人のユーザーを含む 2 つ以上のグループに分割する必要があるアプリを作成しています。 8 人を超える任意の数のユーザーが存在できます。
たとえば、11 人のユーザーはサイズ 4、4、3 の 3 つのグループに分けることができます。これを [4,4,3] と指定します。その他の例としては以下のようなものがある。
各グループに 3、4、または 5 人のユーザーが含まれ、グループ サイズの合計が指定されたユーザー数と等しくなるような、任意の数のユーザー グループのコレクションを取得するにはどうすればよいですか?
解決策
グループの数を最小限に抑える
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]