Tracks
/
Go
Go
/
Ejercicios
/
Simulador de robot
Simulador de robot

Simulador de robot

Intermedia

Instrucciones

Escribe un simulador de robots.

El centro de pruebas de una fábrica de robots necesita un programa para verificar los movimientos de los robots.

Los robots tienen tres movimientos posibles:

  • girar a la derecha
  • girar a la izquierda
  • avanzar

Los robots se colocan en una cuadrícula infinita hipotética, mirando hacia una dirección en particular (norte, este, sur u oeste), en un conjunto de coordenadas {x,y}, por ejemplo {3,8}, con las coordenadas aumentando hacia el norte y el este.

Luego el robot recibe una serie de instrucciones, y en ese momento el centro de pruebas verifica la nueva posición del robot y hacia dónde apunta.

  • La cadena de letras «RAALAL» significa:
    • Gira a la derecha
    • Avanza dos veces
    • Gira a la izquierda
    • Avanza una vez
    • Gira a la izquierda una vez más
  • Supongamos que un robot empieza en {7, 3} mirando hacia el norte. Entonces, ejecutar esta secuencia de instrucciones debería dejarlo en {9, 4} mirando hacia el oeste.

Notas de implementación

Las pruebas están separadas en 3 pasos.

Ejecuta todas las pruebas con go test o ejecuta pruebas específicas con la opción -tags.

Ejemplos:

go test                      # run all tests
go test -tags step1          # run just step 1 tests.
go test -tags 'step1 step2'  # run step1 and step2 tests

Se te entrega el archivo fuente defs.go, que define una serie de cosas que el programa de prueba necesita. Está organizado en tres secciones, una por paso.

Paso 1

Para completar el paso 1, definirás Right, Left, Advance, N, S, E, W y Dir. Completa el paso 1 antes de pasar al paso 2.

Paso 2

En el paso 1 implementaste los movimientos del robot, pero eso no es gran cosa como simulación. Por ejemplo, ¿dónde está «el robot» en el código fuente? ¿Dónde está «la cuadrícula»? ¿Dónde están los cálculos que convierten las acciones del robot en posiciones de la cuadrícula, en el robot o en la cuadrícula? El mundo físico es distinto.

El paso 2 introduce una «sala». Parece una adición pequeña, pero haremos grandes cambios para aclarar los roles de la «sala», el «robot» y el «programa de prueba», y empezar a aclarar la física de la simulación. Definirás Room y Robot como funciones que el programa de prueba «trae al mundo» al lanzarlas como goroutines. La información viaja entre el programa de prueba, el robot y la sala a través de canales de Go.

Piensa en Room como un «motor de física», algo que modela y simula una sala física con paredes y un robot. De alguna manera debe modelar el espacio de coordenadas de la sala, la ubicación del robot y las paredes, y asegurar, por ejemplo, que el robot no atraviese las paredes. Queremos que Robot sea un agente que realiza acciones, pero queremos que Room mantenga una verdad coherente.

El programa de prueba crea los canales e inicia tanto a Room como a Robot. Luego, el programa de prueba envía comandos a Robot. Cuando termina de enviar comandos, cierra el canal de comandos. Robot debe aceptar los comandos e informar a Room de las acciones que intenta. Cuando detecta que el canal de comandos se cierra, debe apagarse. La sala debe interpretar las consecuencias físicas de las acciones del robot. Cuando detecta que el robot se apaga, envía un informe final de vuelta al programa de prueba, indicando la posición y la dirección finales del robot.

Paso 3

El paso 3 tiene tres cambios importantes:

  • Los robots ejecutan scripts en lugar de responder a comandos individuales.
  • Un canal de log permite que los robots y la sala registren mensajes.
  • La sala permite que existan y operen varios robots a la vez.

Para el informe de posición final que se envía desde Room3, puedes devolver el mismo slice que recibes del canal de robots, solo con las posiciones y direcciones actualizadas. Se deben enviar mensajes al canal de log en los siguientes casos:

  • Un robot sin nombre
  • Nombres de robot duplicados
  • Robots colocados en el mismo lugar
  • Un robot colocado fuera de la sala
  • Un comando indefinido en un script
  • Una acción de un robot desconocido
  • Un robot que intenta avanzar hacia una pared
  • Un robot que intenta avanzar hacia otro robot

Fuente

Inspirado en una pregunta de entrevista en una empresa famosa.
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Go Exercism

¿Todo listo para empezar Simulador de robot?

Regístrate en Exercism para aprender y dominar Go con 34 conceptos165 ejercicios y mentoría humana real, todo gratis.