Techioz Blog

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]