2010-06-07 11 views
0

Je suis en train de mettre en place un Défi de Coupe du Monde entre amis et j'ai décidé de pratiquer mon Rubis et d'écrire un petit script pour automatiser le processus.Aidez-moi à refactoriser mon Défi de Coupe du Monde Script

Le problème:

  • 32 éliminatoires de la Coupe du monde divisé en 4 niveaux par leur classement de la FIFA
  • 8 entrées
  • Chaque entrée est affecté 1 équipe au hasard par niveau
  • Winner takes all :-)

J'ai écrit quelque chose qui me suffit pourtant Force brute. Mais, dans ma tentative d'améliorer mon Ruby, je reconnais que ce code n'est pas la solution la plus élégante autour de - Alors je me tourne vers vous, les experts, pour me montrer le chemin.

Il peut être plus clair pour vérifier ce point essentiel - https://gist.github.com/91e1f1c392bed8074531

Ma solution actuelle (faible):

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 

Je suis sûr qu'il ya une meilleure façon de parcourir les niveaux, et en dupliquant l'objet @players (dup() ou clone() peut-être?)

Alors d'un Ventilateur de Coupe à l'autre, aidez-moi.

Répondre

2

Je suis encore à apprendre Ruby aussi, mais voici une tentative:

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(' ') }