I just found an old post from @evanilukhin
showing interview task - *Simple word calculator.* I was reading it on my mobile, so first I read his post, and decided to not look at the answer code (anyway it's impossible to understand on small android display).

Task is next: make this code work:

```
one.plus.two.equal # => 3
one.minus.three.equal # => -2
```

While you're on interview, it can be harder than it should be. Few minutes later electricity came back (some works during this morning... awful), so I decided to try to solve it (in his post I read it's good for every developer to check his skills... and it's true). You have a link to his post if you want to read it and see his results (probably better than mine, but hey, 10 minutes on android 5, and it works... :P).

So what do you think, are you able to make this code work without reading the rest? Here's my solution (first one, fast one):

## My Answer

```
class One
def initialize
@num = 1
end
def plus
@opt = :add
return self
end
def minus
@opt = :rmw
return self
end
def two
case @opt
when :add then @num += 2
when :rmw then @num -= 2
end
return self
end
def three
case @opt
when :add then @num += 3
when :rmw then @num -= 3
end
return self
end
def equal
num = @num
@num = 1
return num
end
end
one = One.new
one.plus.two.equal => 3
one.minus.three.equal => -2
```

and about 10 minutes later I decided to make this more DRY, and to allow it to use 'one' chained more times (like original article code work)

```
class One
def initialize
@num = 1
end
def one
use_number 1
end
def two
use_number 2
end
def three
use_number 3
end
def plus; set_opt(:add) end
def minus; set_opt(:rmw) end
def equal
num = @num and @num = 1
return num
end
private
def set_opt(opt)
@opt = opt; return self
end
def use_number(number)
case @opt
when :add then @num += number.to_i
when :rmw then @num -= number.to_i
else @num
end
@opt = nil
return self
end
end
one = One.new
one.plus.two.equal # => 3
one.plus.two.minus.three.plus.one.equal => 1
```

## Discussion (0)