Rutas
/
Go
Go
/
Ejercicios
/
Simulador de robot
Simulador de robot

Simulador de robot

Media

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 en una dirección concreta (north, east, south o west) en un conjunto de coordenadas {x,y}, por ejemplo, {3,8}, con las coordenadas aumentando hacia el norte y el este.

El robot recibe entonces una serie de instrucciones, momento en el que el centro de pruebas verifica su nueva posición y hacia dónde apunta.

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

Notas de implementación

Las pruebas están separadas en 3 pasos.

Ejecuta todas las pruebas con go test o ejecuta pruebas concretas 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 proporciona el archivo fuente defs.go, que define varias cosas que el programa de pruebas necesita. Está organizado en tres secciones, una por cada 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 no es una gran 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 diferente.

El paso 2 introduce una «sala». Parece una pequeña adición, pero haremos grandes cambios para aclarar los roles de «sala», «robot» y «programa de pruebas», y empezaremos a aclarar la física de la simulación. Definirás Room y Robot como funciones que el programa de pruebas «hace existir» lanzándolas como goroutines. La información se mueve entre el programa de pruebas, el robot y la sala a través de canales de Go.

Piensa en Room como un «motor de físicas», algo que modela y simula una sala física con paredes y un robot. De algún modo debe modelar el espacio de coordenadas de la sala, la ubicación del robot y de las paredes, y garantizar, 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 pruebas crea los canales e inicia tanto Room como Robot. Después, el programa de pruebas envía comandos a Robot. Cuando termina de enviar comandos, cierra el canal de comandos. Robot debe aceptar comandos e informar a Room de las acciones que intenta. Cuando detecta que el canal de comandos se está cerrando, 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 pruebas, 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 registro permite a los robots y a la sala registrar mensajes.
  • La sala permite que existan y operen varios robots a la vez.

Para el informe de posición final enviado desde Room3, puedes devolver el mismo slice recibido del canal de robots, solo con las posiciones y direcciones actualizadas. Se deben enviar mensajes por el canal de registro para

  • Un robot sin nombre
  • Nombres de robot duplicados
  • Robots colocados en el mismo lugar
  • Un robot colocado fuera de la sala
  • Un comando no definido 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 pestaña nueva
Go Exercism

¿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.