4

チームのIDに基づいてシーズンのフィクスチャリストを作成しようとしています。20のチームがあり、毎週、1つのチームは1回しかプレーできません。したがって、第1週の場合、フィクスチャは(1、2)、(3、4)、(5、6)、...、(19、20)になります。次に、2週目、(1、3)、(2、4)、(5、7)、...、(18、20)。

器具を簡単に動かすことができるような式はありますか?たぶん、組み合わせはここで使用するのに最適なものではありません。この問題を解決するための最善の方法は何でしょうか?

class FixtutreGenerator
   a = Array(1..20)
   i = 0

  while i < a.combination(2).to_a.length
    print a.combination(2).to_a[i]
    i = i + 20
 end
end
4

1 に答える 1

6

ラウンド ロビン トーナメントでチームのスケジューリングを行おうとしているようです。ウィキペディアでは、使用できるアルゴリズムについて説明しています。 http://en.wikipedia.org/wiki/Round-robin_tournament#Scheduling_algorithmを参照してください。

以下は、毎週のペアリングを出力するアルゴリズムを実装しています。

teams = Array(1..20)
fixed_team = teams.shift   #The fixed competitor described in the algorithm
teams.length.times do |i|

    #Create the two groups listed in the algorithm
    teams = teams.rotate
    week_teams = teams.dup.unshift(fixed_team) 
    first_group, second_group = week_teams.each_slice(week_teams.length/2).to_a
    second_group.reverse!
    weeks_pairings = first_group.zip(second_group)

    #Output the week's pairings
    puts "Week #{i + 1}: #{weeks_pairings}"
end 

#Output:
#=> Week 1: [[1, 2], [3, 20], [4, 19], [5, 18], [6, 17], [7, 16], [8, 15], [9, 14], [10, 13], [11, 12]]
#=> Week 2: [[1, 3], [4, 2], [5, 20], [6, 19], [7, 18], [8, 17], [9, 16], [10, 15], [11, 14], [12, 13]]
#=> etc
于 2013-01-16T20:55:36.700 に答える