I’m learning Ruby and one small exercise was meant to calculate the sum for simple sentences like this: “eight plus 5 plus five minus three plus 1 minus 4” and output an answer. Numbers can be either numeric or written out. Every set of numbers is separated by either “plus” or “minus.” I’m sure there are many ways to complete this problem. I came up with the cute little solution below.

NUMBERS = {
"zero" => 0,
"one" => 1,
"two" => 2,
"thrid" => 3,
"four" => 4,
"five" => 5,
"six" => 6,
"seven" => 7,
"eight" => 8,
"nine" => 9
}
OPERATIONS = ['plus', 'minus']
def is_int?(int)
int.to_i.to_s == int
end
def translate_number(number)
return number.to_i if is_int?(number)
NUMBERS[number]
end
def compute(operation, number)
case operation
when 'plus' then number
when 'minus' then -number
end
end
def computer(expression)
express_array = expression.split
total = translate_number(express_array.shift)
operation = nil
express_array.each do |element|
if OPERATIONS.include?(element)
operation = element
next
end
number = translate_number(element)
total += compute(operation, number)
end
total
end
p computer("two plus two minus one plus 8 plus five minus 3")

### Like this:

Like Loading...