Little robot (IV): Ruby version

Besides the console faking and the dependency inversion issue, my code in Ruby was pretty rough. You can see here the version I sent.

One obvious problem is the use of string instead of symbols. It was a bad bad mistake. So big if I had been the person testing, I would have thought very bad of myself.

Anyway it was clear that Java version was considerably more verbose.

So one obvious improvement is using symbols instead of string. But during the interview, I asked what other improvements people have done on the assignment. One tip I received is the use of Array.rotate. I don’t like that improvement, because it makes the code less understandable. But I didn’t like the verbosity of the case, and I tested a different approach. This is the code I left in the end:

class Robot   VALID_X = 0..4   VALID_Y = 0..4   VALID_F = [:NORTH,:SOUTH,:EAST,:WEST]   TURN_RIGHT = {:SOUTH=>:WEST,:NORTH=>:EAST,:EAST=>:SOUTH,:WEST=>:NORTH}   TURN_LEFT = {:SOUTH=>:EAST,:NORTH=>:WEST,:EAST=>:NORTH,:WEST=>:SOUTH}   MOVE = {:SOUTH=>[0,-1],:NORTH=>[0,1],:EAST=>[1,0],:WEST=>[-1,0]}

  def initialize     @accepting=false   end

  def place(cols,rows,facing)     x=cols.to_i     y=rows.to_i     f=facing.to_sym     if is_valid?(x,y,f)       @x=x       @y=y       @f=f       @accepting=true     end   end

  def left       return unless @accepting       @f=TURN_LEFT[@f]   end

  def right       return unless @accepting       @f=TURN_RIGHT[@f]   end

  def move       return unless @accepting       delta=MOVE[@f]       x = @x + delta[0]       y = @y + delta[1]       if is_valid?(x,y)         @x=x         @y=y       end   end

  def report     return nil unless @accepting     "#{@x.to_s},#{@y.to_s},#{@f}"   end

protected   def is_valid?(x,y,f=@f)       VALID_X.include?(x) && VALID_Y.include?(y) && VALID_F.include?(f)   end end

First published here