class PrimeFactor
  attr_accessor :all_factors
  
  def largest_divisor_less_than(number)
    divisor = 2
    while divisor <= Math.sqrt(number)
      return number / divisor if number % divisor == 0
      divisor = divisor + 1
    end
    return 1
  end

  def initialize
    self.all_factors = Hash.new do |h, index|
      number = index
      divisor = largest_divisor_less_than(number)
      if divisor == 1
        factors = []
        factors << number if number > 1
        h[index] = factors
      else
        number = number / divisor
        h[index] = [number] + h[divisor]
      end
    end
  end
  
  def [](number)
    all_factors[number]
  end
end

describe PrimeFactor do
  factor = PrimeFactor.new

  { 1 => [],
    2 => [2],
    3 => [3],
    4 => [2, 2],
    5 => [5],
    6 => [2, 3],
    8 => [2, 2, 2],
    12 => [2,2,3],
    16 => [2, 2, 2, 2],
    18 => [2, 3, 3],
    24 => [2, 2, 2, 3],
    (2*2*3*3) => [2, 2, 3, 3],
    (2*3*3*5*5*5*11*17) => [2, 3, 3, 5, 5, 5, 11, 17]
  }.each do |number, factors|
    example("#{number} => #{factors.inspect}") { factor[number].should == factors }
  end
end