Помогите мне реорганизовать мой сценарий вызова Кубка мира - PullRequest
0 голосов
/ 08 июня 2010

Я устраиваю соревнование Кубка мира между несколькими друзьями и решил попрактиковаться в моем 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() может быть?)

Так что от одного фаната Кубка к другому, помоги мне.

1 Ответ

2 голосов
/ 08 июня 2010

Я все еще изучаю 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(' ') }
...