2010-06-07 32 views
0

我在一些朋友之間建立了一場世界盃挑戰賽,並決定練習我的Ruby並編寫一個小腳本來自動化流程。幫助我重構我的世界盃挑戰賽腳本

問題:

  • 32世界盃限定符分成4層可以通過國際足聯排名
  • 8個條目
  • 的每個條目被分配1個隨機團隊每層
  • 贏者通吃:-)

我寫了一些足夠的東西,但是無可否認蠻力。但是,爲了改進我的Ruby,我承認這個代碼並不是最優雅的解決方案 - 所以我請專家來向我展示它的方式。

可能更清楚地看看這個要點 - https://gist.github.com/91e1f1c392bed8074531

我目前(差)的解決方案

require 'yaml' 

@teams = YAML::load(File.open('teams.yaml')) 
@players = %w[Player1 Player2 Player3 Player4 Player5 Player6 Player7 Player8] 

results = Hash.new 
players = @players.sort_by{rand} 

players.each_with_index do |p, i| 
    results[p] = Array[@teams['teir_one'][i]] 
end 

second = @players.sort_by{rand} 
second.each_with_index do |p, i| 
    results[p] << @teams['teir_two'][i] 
end 

third = @players.sort_by{rand} 
third.each_with_index do |p, i| 
    results[p] << @teams['teir_three'][i] 
end 

fourth = @players.sort_by{rand} 
fourth.each_with_index do |p, i| 
    results[p] << @teams['teir_four'][i] 
end 

p results 

我肯定有一個更好的方式,通過層次遍歷,並複製@players對象(dup()clone()也許?)

所以從一個杯子到另一個杯子,幫助我。

回答

2

我還在學習Ruby太多,但這裏是一個嘗試:

require 'yaml' 

tiers = YAML::load(File.open('world_cup_tiers.yaml')) 
players = %w[P1 P2 P3 P4 P5 P6 P7 P8] 

draws = Hash.new { |h,k| h[k] = [] } 

tiers.each do |tier, teams| 
    players.zip(teams.sort_by{rand}).each do |tuple| 
     player, team = tuple 
     draws[player].push(team) 
    end 
end 

players.each { |player| puts [player, draws[player]].join(' ') }