É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 :
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.
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.
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.
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.
L'étape 3 apporte trois changements majeurs :
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 :
Inscris-toi sur Exercism pour apprendre et maîtriser Go avec 34 concepts165 exercices, et un vrai mentorat humain, le tout gratuitement.