class SimpleTournament
Attributes
matches[R]
number[R]
tournament[R]
Public Class Methods
new(number)
click to toggle source
initialize tournament by number
# File lib/simple_tournament.rb, line 8 def initialize(number) @number = number @matches = [] cnt = 0 @tournament = [] while number >= (2**cnt) tournament << Array.new(2**cnt) cnt += 1 end diff = number - (2**(cnt - 1)) @tournament << Array.new(diff * 2) unless (diff == 0) end
Public Instance Methods
apply_challengers(challengers)
click to toggle source
apply challengers to tournament
# File lib/simple_tournament.rb, line 22 def apply_challengers(challengers) fail 'incorrect challengers size. challengers must equals tournament.size' unless challengers.size == @number @tournament.reverse_each do |outer| outer.each_with_index do |v, i| poped = challengers.pop return @tournament if poped.nil? outer[i] = poped end end end
start_match(proc)
click to toggle source
start tournament match. set result to tournament, matches
# File lib/simple_tournament.rb, line 34 def start_match(proc) @tournament.reverse_each.with_index do |outer, outer_index| outer.reverse_each.with_index do |inner, inner_index| next if inner_index.odd? next if inner_index == outer.size - 1 rets = proc.call outer[-(inner_index + 1)], outer[-(inner_index + 2)], outer_index winner = rets.first @matches << rets.last set_winner(winner, outer_index) end end end
Private Instance Methods
set_winner(winner, outer_index)
click to toggle source
# File lib/simple_tournament.rb, line 49 def set_winner(winner, outer_index) @tournament[0..-(outer_index + 1)].reverse_each do |replace_outer| replace_outer.reverse_each.with_index do |reverse_inner, reverse_inner_index| next unless reverse_inner.nil? return replace_outer[-(reverse_inner_index + 1)] = winner end end end