class RPNCalculator def evaluate(rpn_expr) begin count = 0 result = rpn_expr.split(' ').each_with_object([]) do |item,arr| item.match(/(\A-?\d+\z)|(\A[\+\-\*]\z)/) do if $1 count += 1 arr << item.to_i else count -= 1 raise ArgumentError.new("not enough digits!") if count < 1 arr[-2..-1] = ( arr[-2].send(item, arr[-1]) ) end end or raise ArgumentError.new("malformed RPN expression!") end count == 1 && result.first or raise ArgumentError.new("too many digits!") rescue ArgumentError => e e.message end end end