Hogy-Bear

refactored

Oct 16th, 2019
419
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.81 KB | None | 0 0
  1. class Tournament
  2.  
  3.   def initialize
  4.     @players = []
  5.   end
  6.  
  7.   def add_player(player)
  8.     @players << player
  9.   end
  10.  
  11.   def sort_players
  12.     @players.sort!{|p1, p2| p1.score <=> p2.score}.reverse!
  13.   end
  14.  
  15.   def to_s
  16.     str =  "Average rating is: #{average_rating}\n"
  17.     @players.each do |p|
  18.       str += p.to_s
  19.       str += " AVG OPPONENT RATING: #{p.get_rating}"
  20.       str += " TOTAL: #{p.score} points"
  21.       str += " NEW RATING: #{new_rating(p).to_i}\n"
  22.     end
  23.     str
  24.   end
  25.  
  26.   private
  27.  
  28.   def total_rating
  29.     total_rating = 0
  30.     @players.each{|p| total_rating += p.get_rating}
  31.     total_rating
  32.   end
  33.  
  34.   def average_rating
  35.     total_rating / @players.size
  36.   end
  37.  
  38.   def average_opponent_ratings(curr_player_rating)
  39.       (total_rating - curr_player_rating) / (@players.size - 1)
  40.   end
  41.  
  42.   def expected_score_per_round(player)
  43.     1.0 / (1.0 + 10.0**((average_opponent_ratings( player.get_rating ) - player.get_rating ) / 400.0) )
  44.   end
  45.  
  46.   def new_rating(player)
  47.     player.get_rating + 40 * ( player.score * 1.0 - ( ( @players.size - 1) * expected_score_per_round(player)))
  48.   end
  49.  
  50. end
  51.  
  52. class Player
  53.  
  54.   def initialize(name, rating, results)
  55.     @name = name
  56.     @rating = rating
  57.     @results = results
  58.   end
  59.  
  60.   def get_rating
  61.     @rating
  62.   end
  63.  
  64.   def score
  65.     @results.inject(0) { |sum,val| sum += val }
  66.   end
  67.  
  68.   def to_s
  69.     str = @name + " #{@rating} "
  70.     @results.each {|r| str+=" #{r}"}
  71.     str
  72.   end
  73.  
  74. end
  75.  
  76. t = Tournament.new
  77. file = File.new('tournament_results.txt', "r")
  78. while (line = file.gets)
  79.   data =  line.split # so data is an array of strings
  80.   name = data[0]
  81.   rating = data[1].to_i
  82.   results = []
  83.   data[2..data.length].each_with_index{|res,i| results[i]=res.to_i}
  84.   p = Player.new(name, rating, results)
  85.   t.add_player(p)
  86. end
  87. t.sort_players
  88. puts t.to_s
Advertisement