class ActiveGenie::Ranking::PlayersCollection
def build(param_players)
def build(param_players) param_players.map { |p| Player.new(p) } end
def calc_defender_tier
def calc_defender_tier eligible[(tier_size*-2)...(tier_size*-1)] end
def calc_relegation_tier
def calc_relegation_tier eligible[(tier_size*-1)..-1] end
def coefficient_of_variation
def coefficient_of_variation score_list = eligible.map(&:score).compact return nil if score_list.empty? mean = score_list.sum.to_f / score_list.size return nil if mean == 0 variance = score_list.map { |num| (num - mean) ** 2 }.sum / score_list.size standard_deviation = Math.sqrt(variance) (standard_deviation / mean) * 100 end
def eligible
def eligible sorted.reject(&:eliminated) end
def eligible_size
def eligible_size @players.reject(&:eliminated).size end
def elo_eligible?
def elo_eligible? eligible.size > 15 end
def initialize(param_players)
def initialize(param_players) @players = build(param_players) end
def method_missing(...)
def method_missing(...) @players.send(...) end
def sorted
def sorted sorted_players = @players.sort_by { |p| [-p.ffa_score, -(p.elo || 0), -(p.score || 0)] } sorted_players.each_with_index { |p, i| p.rank = i + 1 } sorted_players end
def tier_size
- 14 eligible, tier_size: 4
- 24 eligible, tier_size: 10
- 35 eligible, tier_size: 11
- 50 eligible, tier_size: 15
Example:
based on the eligible size, start fast and go slow until top 10
Returns the number of players to battle in each round
def tier_size [[(eligible_size / 3).ceil, 10].max, eligible_size - 10].min end
def to_h
def to_h sorted.map { |p| p.to_h } end