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