Using Complex Numbers to Move Mars Rover

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!

Design

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