A solution in Ruby to the Cup Semi-final problem in the inaugural Codehire Cup held in September 2012 at the University of Adelaide.

In September 2012, Codehire held the inaugural Codehire Cup in Adelaide, featuring some relatively simple coding problems. Contestants could choose to use C#, Java, JavaScript, PHP, or Ruby to submit solutions through a web-based interface. Fastest contestant wins.

### The Problem

The Cup Semi-final problem read:

Calculate the result of the expression.

The input string will be random but will only contain the numbers one through nine and the plus and minus operators. No operator precedence rules need be applied.

The input may include up to 10 operators.

Your result should simply be an Integer cast to a string.

Example:

five plus four plus six minus sevenResult:

8

### The Solution

The problem is made trivial by the built-in Ruby `eval`

method: we simply need to replace ‘plus’ with ‘+’, ‘minus’ with ‘-’, and each digit specified as a word with the same digit as a numeral.

```
nums = 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'
str = input.gsub('plus', '+').gsub('minus', '-')
nums.each_with_index do |s, i|
str.gsub!(s, i.to_s)
end
output << eval(str).to_s
```

### Another Solution

If we didn’t have the built-in Ruby `eval`

method, we’d have to be more clever.

```
nums = 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'
res = nums.find_index input[/^[a-z]+/]
input.scan(/plus ([a-z]+)/) { |m| res += nums.find_index m[0] }
input.scan(/minus ([a-z]+)/) { |m| res -= nums.find_index m[0] }
output << res.to_s
```

### More Codehire Cup Solutions

- Practice Challenge Solution
- Codehire Cup Preliminary Solution
- Cup Semi-final Solution
- Grand Final Solution