Tracks
/
Go
Go
/
Übungen
/
Robotersimulator
Robotersimulator

Robotersimulator

Mittel

Anleitung

Schreibe einen Robotersimulator.

Die Testanlage einer Roboterfabrik braucht ein Programm, um die Bewegungen der Roboter zu überprüfen.

Die Roboter haben drei mögliche Bewegungen:

  • Nach rechts drehen
  • Nach links drehen
  • Vorrücken

Roboter werden auf einem hypothetischen, unendlichen Raster platziert und blicken in eine bestimmte Richtung (north, east, south oder west). Sie stehen auf bestimmten {x,y}-Koordinaten, zum Beispiel {3,8}, wobei die Koordinaten nach Norden und Osten hin zunehmen.

Danach erhält der Roboter eine Reihe von Anweisungen. Daraufhin überprüft die Testanlage die neue Position des Roboters und seine Blickrichtung.

  • Die Zeichenkette „RAALAL“ bedeutet:
    • Nach rechts drehen
    • Zweimal vorrücken
    • Nach links drehen
    • Einmal vorrücken
    • Und noch einmal nach links drehen
  • Angenommen, ein Roboter startet bei {7, 3} mit Blickrichtung north. Führt man diese Anweisungsfolge aus, sollte er anschließend bei {9, 4} mit Blickrichtung west stehen.

Hinweise zur Implementierung

Die Tests sind in 3 Schritte aufgeteilt.

Führe alle Tests mit go test aus oder führe bestimmte Tests mit der Option -tags aus.

Beispiele:

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

Du bekommst die Quelldatei defs.go, die eine Reihe von Dingen definiert, die das Testprogramm benötigt. Sie ist nach Schritten in drei Abschnitte gegliedert.

Schritt 1

Um Schritt 1 abzuschließen, definierst du Right, Left, Advance, N, S, E, W und Dir. Schließe Schritt 1 ab, bevor du mit Schritt 2 weitermachst.

Schritt 2

Für Schritt 1 hast du Roboterbewegungen implementiert, aber das ist noch keine richtige Simulation. Wo im Quellcode ist zum Beispiel „der Roboter"? Wo ist „das Raster"? Wo sind die Berechnungen, die Roboteraktionen in Rasterpositionen umwandeln, im Roboter oder im Raster? Die physische Welt ist anders.

Schritt 2 führt einen „Raum" ein. Es scheint eine kleine Ergänzung zu sein, aber wir nehmen große Änderungen vor, um die Rollen von „Raum", „Roboter" und „Testprogramm" zu klären und die Physik der Simulation zu verdeutlichen. Du definierst Room und Robot als Funktionen, die das Testprogramm „ins Leben ruft", indem es sie als Goroutinen startet. Informationen wandern zwischen Testprogramm, Roboter und Raum über Go-Kanäle.

Betrachte Room als eine „Physik-Engine", etwas, das einen physischen Raum mit Wänden und einem Roboter modelliert und simuliert. Sie sollte irgendwie den Koordinatenraum des Raums, den Standort des Roboters und der Wände modellieren und zum Beispiel dafür sorgen, dass der Roboter nicht durch Wände läuft. Wir wollen, dass Robot ein Agent ist, der Aktionen ausführt, aber wir wollen, dass Room eine stimmige Wahrheit aufrechterhält.

Das Testprogramm erstellt die Kanäle und startet sowohl Room als auch Robot. Dann sendet das Testprogramm Befehle an Robot. Wenn es mit dem Senden der Befehle fertig ist, schließt es den Befehlskanal. Robot muss Befehle annehmen und Room über Aktionen informieren, die er auszuführen versucht. Wenn er erkennt, dass der Befehlskanal geschlossen wird, muss er sich selbst beenden. Der Raum muss die physischen Konsequenzen der Roboteraktionen interpretieren. Wenn er erkennt, dass sich der Roboter beendet, sendet er einen Abschlussbericht zurück an das Testprogramm, der die endgültige Position und Richtung des Roboters enthält.

Schritt 3

Schritt 3 bringt drei große Änderungen:

  • Roboter führen Skripte aus, statt auf einzelne Befehle zu reagieren.
  • Ein Log-Kanal ermöglicht Robotern und dem Raum, Nachrichten zu protokollieren.
  • Der Raum erlaubt es, dass mehrere Roboter gleichzeitig existieren und arbeiten.

Für den Abschlussbericht zur Position, der von Room3 gesendet wird, kannst du denselben Slice zurückgeben, den du vom robots-Kanal empfangen hast, nur mit aktualisierten Positionen und Richtungen. Nachrichten müssen auf dem Log-Kanal gesendet werden für

  • einen Roboter ohne Namen
  • doppelte Roboternamen
  • Roboter, die an derselben Stelle platziert werden
  • einen Roboter, der außerhalb des Raums platziert wird
  • einen undefinierten Befehl in einem Skript
  • eine Aktion von einem unbekannten Roboter
  • einen Roboter, der versucht, in eine Wand vorzurücken
  • einen Roboter, der versucht, in einen anderen Roboter vorzurücken

Quelle

Inspiriert von einer Interviewfrage bei einer bekannten Firma.
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Go Exercism

Bereit, mit Robotersimulator zu starten?

Melde dich bei Exercism an, um Go mit 34 Konzepte165 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.