Mars Rover

Es muy común encontrar programas que dependen del estado. Esto es especialmente cierto en el código de interfaz de usuario.

Sin embargo, el estado también es una fuente muy común de errores. La principal razón por la que se producen estos fallos es que el estado es difícil de razonar.

Hasta cierto punto, los buenos test cases ayudan en los programas con estados. Sin embargo, las pruebas por sí solas no bastan, también es esencial un buen diseño.

Esta kata se presta a una variedad de enfoques de diseño orientado a objetos, lo que la convierte en una excelente forma de practicar tus habilidades de diseño. Se adapta bien a dos patrones de diseño en particular: el Command pattern y el State pattern.

Hay varias formas de practicar con esta kata. Sugerimos primero hacer una implementación inicial siguiendo los principios SOLID y las 4 reglas de diseño simple. Después, comprueba si puedes refactorizar tu solución para utilizar alguno de los patrones de diseño anteriores. También puedes volver a intentar la kata desde cero con una solución concreta en mente.

Instrucciones

La NASA va a aterrizar un escuadrón de robots exploradores en una meseta de Marte.

Esta meseta, curiosamente rectangular, debe ser recorrida por los robots para que sus cámaras a bordo puedan obtener una vista completa del terreno circundante y enviarla a la Tierra.

Tu tarea consiste en desarrollar una API que movilice a los robots por la meseta.

En esta API, la meseta se representa como una cuadrícula de 10x10, y un robot tiene un estado que consta de dos partes:

  • Su posición en la cuadrícula (representada por una pareja de coordenadas X,Y)
  • La dirección de la brújula hacia la que está orientado (representada por una letra, una de N, S, E, W)

Input

El input del programa es una cadena de comandos de movimiento de un carácter:

  • L y R rotan la dirección en la que está orientado el robot
  • M mueve el vehículo una casilla hacia delante en la dirección en la que se encuentra en ese momento.

Si un rover llega al final de la meseta, da un giro al final de la cuadrícula.

Output

El output del programa es la posición final del robot después de que se hayan ejecutado todos los comandos de movimiento. La posición se representa como una pareja de coordenadas y una dirección, unidas por dos puntos para formar una cadena. Por ejemplo: un robot cuya posición es 2:3:W está en la casilla (2,3), mirando al oeste.

Obstáculos

La cuadrícula puede tener obstáculos. Si una secuencia de comandos determinada encuentra un obstáculo, el robot se desplaza hasta el último punto posible e informa del obstáculo anteponiendo O: a la cadena de posición que devuelve. Por ejemplo,  O:1:1:N  significaría que el robot ha encontrado un obstáculo en la posición (1, 2).

Ejemplos

  • En una cuadrícula sin obstáculos, el input MMRMMLM da un output de 2:3:N
  • En una cuadrícula sin obstáculos, el input MMMMMMMMMM da un output de 0:0:N (debido al giro)
  • En una cuadrícula con un obstáculo en (0, 3), el input MMMM da un output de O:0:2:N

Interfaz

No hay restricciones en el diseño de la interfaz pública. En concreto, gran parte de los detalles de la implementación de la función de obstáculo dependen de ti.

Una interfaz pública a la API podría parecerse a esto:

class MarsRover {
public MarsRover(Grid grid);
public String execute(String command);
}

 

Reglas:

  • El robot recibe una matriz de comandos, por ejemplo RMMLM y devuelve el punto final después de sus movimientos, por ejemplo 2:1:N
  • El robot da la vuelta si llega al final de la cuadrícula.

Crédito: Google Code Archive

Crédito: Google Code Archive

Libros

Artículos

Soluciones

Videos