[QUIZ] Tournament Matchups (#105)

Following (and attached) is the copy of my code. The main logic of it
is very simple:
1. Create "bye" teams until there is a power of two
2. From an array sorted by "goodness" of a team, make matches by taking
a team from the two ends.

A nice and short version which does the above is below (and attached as
tournielean.rb). I actually wrote this version after writing the other
version because most of the entries to Ruby Quiz seem to be short.
./tournielean n where n is the number of teams to run it.
#! /usr/bin/ruby

class Numeric
  # Is the given number a power of self?
  # 16.isPowerOf(2) == true
  # 100.isPowerOf(2) == false
  def isPowerOf(other)
    i = 0
    while (other ** i <= self)
      return true if other ** i == self
      i += 1
    end
    false
  end
end

class Tournament
  # Recieves a list of team names in order of ranking with the best first.
  def initialize(teams)
    @eligible = teams
    @round = 0
  end
  
  def createNextRound
    out = "Round #{@round += 1}: "
    inCurrentRound = []
    
    until (@eligible.length.isPowerOf(2))
      out += "#{@eligible.first} vs. bye, "
      inCurrentRound.push @eligible.shift
    end
    
    until (@eligible.empty?)
      winner = @eligible.shift
      loser = @eligible.pop
      
      out += "#{winner} vs. #{loser}, "
      
      inCurrentRound.push(winner)
    end
    
    @eligible = inCurrentRound
    out[0, out.length - 2] + "."
  end
  
  def createAllRounds
    out = ""
    until (@eligible.length == 1)
      out << createNextRound << "\n"
    end
    out# + "Winner: #{@eligible[0]}"
  end
end

t = Tournament.new((1..(ARGV[0].to_i)).to_a)
puts t.createAllRounds

tournielean.rb (1.04 KB)