Parcours
/
Go
Go
/
Exercices
/
Simulateur de robot
Simulateur de robot

Simulateur de robot

Moyen

Instructions

Écris un simulateur de robot.

Le centre de tests d'une usine de robots a besoin d'un programme pour vérifier les déplacements des robots.

Les robots disposent de trois déplacements possibles :

  • tourner à droite
  • tourner à gauche
  • avancer

Les robots sont placés sur une grille infinie hypothétique, orientés dans une direction particulière (north, east, south ou west) à un ensemble de coordonnées {x,y}, par exemple {3,8}, les coordonnées augmentant vers le nord et vers l'est.

Le robot reçoit alors une série d'instructions, après quoi le centre de tests vérifie sa nouvelle position et la direction dans laquelle il pointe.

  • La chaîne de lettres « RAALAL » signifie :
    • Tourner à droite
    • Avancer deux fois
    • Tourner à gauche
    • Avancer une fois
    • Tourner à gauche encore une fois
  • Imaginons qu'un robot démarre à la position {7, 3}, orienté vers le nord. L'exécution de cette suite d'instructions doit alors le laisser à la position {9, 4}, orienté vers l'ouest.

Notes d'implémentation

Les tests sont répartis en 3 étapes.

Lance tous les tests avec go test ou lance des tests spécifiques avec l'option -tags.

Exemples :

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

On te fournit le fichier source defs.go, qui définit un certain nombre de choses dont le programme de test a besoin. Il est organisé en trois sections, une par étape.

Étape 1

Pour terminer l'étape 1, tu vas définir Right, Left, Advance, N, S, E, W et Dir. Termine l'étape 1 avant de passer à l'étape 2.

Étape 2

Pour l'étape 1, tu as implémenté les déplacements du robot, mais ça ne ressemble pas vraiment à une simulation. Par exemple, où se trouve « le robot » dans le code source ? Où se trouve « la grille » ? Où se trouvent les calculs qui transforment les actions du robot en positions sur la grille, dans le robot ou dans la grille ? Le monde physique est différent.

L'étape 2 introduit une « pièce ». Cela semble un petit ajout, mais on va faire de gros changements pour clarifier les rôles de la « pièce », du « robot » et du « programme de test », et commencer à clarifier la physique de la simulation. Tu vas définir Room et Robot comme des fonctions que le programme de test « fait exister » en les lançant en tant que goroutines. Les informations circulent entre le programme de test, le robot et la pièce via des canaux Go.

Considère Room comme un « moteur physique », quelque chose qui modélise et simule une pièce physique avec des murs et un robot. Il doit d'une manière ou d'une autre modéliser l'espace de coordonnées de la pièce, l'emplacement du robot et des murs, et garantir par exemple que le robot ne traverse pas les murs. On veut que Robot soit un agent qui effectue des actions, mais on veut que Room maintienne une vérité cohérente.

Le programme de test crée les canaux et démarre à la fois Room et Robot. Le programme de test envoie ensuite des commandes à Robot. Quand il a fini d'envoyer les commandes, il ferme le canal de commandes. Robot doit accepter les commandes et informer Room des actions qu'il tente d'effectuer. Quand il détecte la fermeture du canal de commandes, il doit s'arrêter. La pièce doit interpréter les conséquences physiques des actions du robot. Quand elle détecte l'arrêt du robot, elle renvoie un rapport final au programme de test, indiquant la position et la direction finales du robot.

Étape 3

L'étape 3 apporte trois changements majeurs :

  • Les robots exécutent des scripts plutôt que de répondre à des commandes individuelles.
  • Un canal de journalisation permet aux robots et à la pièce de journaliser des messages.
  • La pièce permet à plusieurs robots d'exister et de fonctionner simultanément.

Pour le rapport de position finale envoyé par Room3, tu peux renvoyer le même slice reçu du canal des robots, avec simplement les positions et les directions mises à jour. Il faut envoyer des messages sur le canal de journalisation dans les cas suivants :

  • Un robot sans nom
  • Des noms de robots en double
  • Des robots placés au même endroit
  • Un robot placé en dehors de la pièce
  • Une commande non définie dans un script
  • Une action d'un robot inconnu
  • Un robot qui tente d'avancer dans un mur
  • Un robot qui tente d'avancer dans un autre robot

Source

Inspiré par une question d'entretien dans une entreprise célèbre.
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Go Exercism

Prêt à commencer Simulateur de robot ?

Inscris-toi sur Exercism pour apprendre et maîtriser Go avec 34 concepts165 exercices, et un vrai mentorat humain, le tout gratuitement.