Skip to content

Instantly share code, notes, and snippets.

@proton
Created December 9, 2017 15:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save proton/2d832bf471e0df182af6f13bc97920a5 to your computer and use it in GitHub Desktop.
Save proton/2d832bf471e0df182af6f13bc97920a5 to your computer and use it in GitHub Desktop.
calculator
NUM_REGEX = /^-?[0-9\.]+/
def calc(expression)
expression = expression.gsub(' ', '').gsub('--', '+').gsub(/([\d\)])-([\(\d])/, '\1+-\2')
calculate(expression)
end
def extract_brackets(expression)
brackets_cnt = 0
expression.chars.each_with_index do |char, i|
brackets_cnt += 1 if char == '('
brackets_cnt -= 1 if char == ')'
next if brackets_cnt > 0
brackets_expression = expression.slice!(0, i + 1)
return calculate(brackets_expression[1...-1])
end
end
def get_num(expression)
return extract_brackets(expression) if expression[0] == '('
if expression[0] == '-' && expression[1] == '('
expression.slice!(0, 1)
return -extract_brackets(expression)
end
num = expression.slice!(NUM_REGEX).to_f
end
def get_op(expression)
expression.slice!(0)
end
def calculate(expression)
expression = expression.gsub(' ', '').gsub(/(\d)-(\d)/, '\1+-\2')
num = get_num(expression)
until expression.empty?
op = get_op(expression)
case op
when '+'
return num + calc(expression)
when '*'
num *= get_num(expression)
when '/'
num /= get_num(expression)
end
end
num
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment