class RpnCalculator::RPN

Attributes

numbers[RW]
operators[RW]

Public Class Methods

calculate(str) click to toggle source
# File lib/rpn_calculator/rpn.rb, line 14
def self.calculate(str) RPNParser.parse(str) end
evaluate(args) click to toggle source
# File lib/rpn_calculator/rpn.rb, line 13
def self.evaluate(args) new(args[0],args[1]).evaluate end
new(numbers,operators) click to toggle source
# File lib/rpn_calculator/rpn.rb, line 3
def initialize(numbers,operators)
  @numbers   = numbers
  @operators = operators
  raise ArgumentError, 'A minimum of two numbers is required' if numbers.count < 2
  raise ArgumentError, 'The number of operators must be exactly one less than number of numbers' unless (numbers.count - 1) == operators.count
  raise ArgumentError, 'Only valid numbers allowed' unless are_numbers?
  raise ArgumentError, 'Only valid numbers allowed' unless are_operators?
end

Public Instance Methods

evaluate() click to toggle source
# File lib/rpn_calculator/rpn.rb, line 15
def evaluate
  evaluated = numbers.shift
  while numbers.count > 0
    evaluated = Float(evaluated).send(operators.shift,Float(numbers.shift))
  end
  return evaluated
end

Private Instance Methods

are_numbers?() click to toggle source
# File lib/rpn_calculator/rpn.rb, line 25
def are_numbers?()   numbers.map{|n| floats?(n)}.inject(:&) end
are_operators?() click to toggle source
# File lib/rpn_calculator/rpn.rb, line 26
def are_operators?() operators.map{|op| operator?(op)}.inject(:&) end
floats?(input) click to toggle source
# File lib/rpn_calculator/rpn.rb, line 24
  def floats?(input)   !!Float(input) rescue(false) end
  def are_numbers?()   numbers.map{|n| floats?(n)}.inject(:&) end
  def are_operators?() operators.map{|op| operator?(op)}.inject(:&) end
  def operator?(input) ['+','-','/','*','**'].include?(input) end
end
operator?(input) click to toggle source
# File lib/rpn_calculator/rpn.rb, line 27
def operator?(input) ['+','-','/','*','**'].include?(input) end