Διαδρομές
/
Go
Go
/
Ασκήσεις
/
Προσομοιωτής ρομπότ
Προσομοιωτής ρομπότ

Προσομοιωτής ρομπότ

Μέτριο

Οδηγίες

Γράψε έναν προσομοιωτή ρομπότ.

Οι εγκαταστάσεις δοκιμών ενός εργοστασίου ρομπότ χρειάζονται ένα πρόγραμμα για να επαληθεύουν τις κινήσεις των ρομπότ.

Τα ρομπότ έχουν τρεις δυνατές κινήσεις:

  • στρίψε δεξιά
  • στρίψε αριστερά
  • προχώρησε

Τα ρομπότ τοποθετούνται σε ένα υποθετικό άπειρο πλέγμα, κοιτώντας προς μια συγκεκριμένη κατεύθυνση (βόρεια, ανατολικά, νότια ή δυτικά) και βρίσκονται σε ένα σύνολο συντεταγμένων {x,y}, π.χ. {3,8}, με τις συντεταγμένες να αυξάνονται προς τα βόρεια και τα ανατολικά.

Στη συνέχεια το ρομπότ λαμβάνει έναν αριθμό εντολών, και τότε οι εγκαταστάσεις δοκιμών επαληθεύουν τη νέα θέση του ρομπότ και προς τα πού δείχνει.

  • Η συμβολοσειρά γραμμάτων "RAALAL" σημαίνει:
    • Στρίψε δεξιά
    • Προχώρησε δύο φορές
    • Στρίψε αριστερά
    • Προχώρησε μία φορά
    • Στρίψε αριστερά για άλλη μια φορά
  • Ας πούμε ότι ένα ρομπότ ξεκινά από το {7, 3} κοιτώντας βόρεια. Τότε, εκτελώντας αυτή τη σειρά εντολών θα πρέπει να καταλήξει στο {9, 4} κοιτώντας δυτικά.

Σημειώσεις υλοποίησης

Τα tests χωρίζονται σε 3 βήματα.

Τρέξε όλα τα tests με go test ή τρέξε συγκεκριμένα tests με την επιλογή -tags.

Παραδείγματα:

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

Σου δίνεται το αρχείο πηγαίου κώδικα defs.go, το οποίο ορίζει έναν αριθμό από πράγματα που χρειάζεται το πρόγραμμα ελέγχου. Είναι οργανωμένο σε τρία τμήματα, ένα για κάθε βήμα.

Βήμα 1

Για να ολοκληρώσεις το βήμα 1, θα ορίσεις τα Right, Left, Advance, N, S, E, W και Dir. Ολοκλήρωσε το βήμα 1 πριν προχωρήσεις στο βήμα 2.

Βήμα 2

Στο βήμα 1 υλοποίησες κινήσεις ρομπότ, αλλά δεν είναι και πολύ προσομοίωση. Για παράδειγμα, πού βρίσκεται "το ρομπότ" στον πηγαίο κώδικα; Πού είναι "το πλέγμα"; Πού είναι οι υπολογισμοί που μετατρέπουν τις ενέργειες του ρομπότ σε θέσεις στο πλέγμα, στο ρομπότ ή στο πλέγμα; Ο φυσικός κόσμος είναι διαφορετικός.

Το βήμα 2 εισάγει ένα "δωμάτιο". Φαίνεται μικρή προσθήκη, αλλά θα κάνουμε μεγάλες αλλαγές για να ξεκαθαρίσουμε τους ρόλους του "δωματίου", του "ρομπότ" και του "προγράμματος ελέγχου" και να αρχίσουμε να ξεκαθαρίζουμε τη φυσική της προσομοίωσης. Θα ορίσεις τα Room και Robot ως συναρτήσεις τις οποίες το πρόγραμμα ελέγχου "φέρνει στη ζωή" εκκινώντας τις ως goroutines. Η πληροφορία κινείται ανάμεσα στο πρόγραμμα ελέγχου, το ρομπότ και το δωμάτιο μέσω των channels της Go.

Σκέψου το Room σαν μια "μηχανή φυσικής", κάτι που μοντελοποιεί και προσομοιώνει ένα φυσικό δωμάτιο με τοίχους και ένα ρομπότ. Θα πρέπει με κάποιον τρόπο να μοντελοποιεί τον χώρο συντεταγμένων του δωματίου, τη θέση του ρομπότ και των τοίχων, και να εξασφαλίζει, για παράδειγμα, ότι το ρομπότ δεν περνάει μέσα από τοίχους. Θέλουμε το Robot να είναι ένας πράκτορας που εκτελεί ενέργειες, αλλά θέλουμε το Room να διατηρεί μια συνεπή αλήθεια.

Το πρόγραμμα ελέγχου δημιουργεί τα channels και ξεκινά και το Room και το Robot. Στη συνέχεια, το πρόγραμμα ελέγχου στέλνει εντολές στο Robot. Όταν τελειώσει με την αποστολή εντολών, κλείνει το channel εντολών. Το Robot πρέπει να δέχεται εντολές και να ενημερώνει το Room για τις ενέργειες που επιχειρεί. Όταν αντιληφθεί ότι το channel εντολών κλείνει, πρέπει να τερματίσει τον εαυτό του. Το δωμάτιο πρέπει να ερμηνεύει τις φυσικές συνέπειες των ενεργειών του ρομπότ. Όταν αντιληφθεί ότι το ρομπότ τερματίζεται, στέλνει μια τελική αναφορά πίσω στο πρόγραμμα ελέγχου, που δηλώνει την τελική θέση και κατεύθυνση του ρομπότ.

Βήμα 3

Το βήμα 3 έχει τρεις μεγάλες αλλαγές:

  • Τα ρομπότ εκτελούν σενάρια αντί να ανταποκρίνονται σε μεμονωμένες εντολές.
  • Ένα channel καταγραφής επιτρέπει στα ρομπότ και στο δωμάτιο να καταγράφουν μηνύματα.
  • Το δωμάτιο επιτρέπει σε πολλά ρομπότ να υπάρχουν και να λειτουργούν ταυτόχρονα.

Για την τελική αναφορά θέσης που στέλνεται από το Room3, μπορείς να επιστρέψεις το ίδιο slice που έλαβες από το channel των ρομπότ, απλώς με ενημερωμένες θέσεις και κατευθύνσεις. Πρέπει να στέλνονται μηνύματα στο channel καταγραφής για:

  • Ρομπότ χωρίς όνομα
  • Διπλότυπα ονόματα ρομπότ
  • Ρομπότ τοποθετημένα στο ίδιο σημείο
  • Ρομπότ τοποθετημένο έξω από το δωμάτιο
  • Μη ορισμένη εντολή σε ένα σενάριο
  • Μια ενέργεια από άγνωστο ρομπότ
  • Ρομπότ που επιχειρεί να προχωρήσει σε τοίχο
  • Ρομπότ που επιχειρεί να προχωρήσει πάνω σε άλλο ρομπότ

Πηγή

Εμπνευσμένο από μια ερώτηση συνέντευξης σε μια διάσημη εταιρεία.
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Go Exercism

Έτοιμος να ξεκινήσεις την άσκηση Προσομοιωτής ρομπότ;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Go με 34 έννοιες165 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.