【问题标题】:Help me refactor my World Cup Challenge Script帮我重构我的世界杯挑战脚本
【发布时间】:2011-02-28 22:51:11
【问题描述】:

我正在一些朋友之间设置世界杯挑战赛,并决定练习我的 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() 可能?)

所以从一个杯迷到另一个,帮帮我。

【问题讨论】:

    标签: ruby refactoring loops iteration


    【解决方案1】:

    我也在学习 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(' ') }
    

    【讨论】: