class SimpleTournament

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