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 = \sqrt{-1}$.
Multiplication of complex numbers allow us to rotate.
$L$: To rotate by $90^o$ left we multiply by $j$.
$R$: To rotate by $90^o$ 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. We expect the rover to look $East$.
$$ 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)$.
$$ \text{Rover positioned at} \ (1,1) + E = (1 + 2j) + 1 = 2 + 2j = (2, 2) $$ Orientation unchanged.