Recently I was given Mars Rover Problem and told that my solution was pretty cool. Before that I assumed this is how everybody else was doing it :-). Here is golang implementation. Enjoy!
Position and orientation are represented as complex numbers implemented as type vect
.
Builtin complex type is not used because it uses floats which they can't be compared easily.
In calculations below j
is sqrt(-1)
.
Multiplication of complex numbers allow us to rotate.
L
: To rotate by 90 left we multiply by j
.
R
: To rotate by 90 right we multiply by -j
.
Mapping of directions to complex numbers.
North: j East: 1 West: -1 South: j
Example: A rover is looking north and we issue R
command.
North * R = j * -j = 1 = East // position unchanged
Addition of complex numbers allow for movements on the grid.
Example: A rover is at (1,2)
looking to east and we issue M
command we expect it to be
at (2,2)
.
rover position (1,1) + E = (1 + 2j) + 1 = 2 + 2j = (2, 2) // orientation unchanged