Track
/
Go
Go
/
Esercizi
/
Simulatore di robot
Simulatore di robot

Simulatore di robot

Medio

Istruzioni

Scrivi un simulatore di robot.

Il centro di collaudo di una fabbrica di robot ha bisogno di un programma per verificare i movimenti dei robot.

I robot hanno tre movimenti possibili:

  • girare a destra
  • girare a sinistra
  • avanzare

I robot vengono collocati su una griglia infinita ipotetica, rivolti verso una direzione precisa (north, east, south o west), in corrispondenza di un insieme di coordinate {x,y}, ad esempio {3,8}, con le coordinate che aumentano verso north e verso east.

Il robot riceve poi una serie di istruzioni, dopodiché il centro di collaudo verifica la nuova posizione del robot e la direzione verso cui è rivolto.

  • La stringa di lettere «RAALAL» significa:
    • Girare a destra
    • Avanzare di due passi
    • Girare a sinistra
    • Avanzare di un passo
    • Girare ancora a sinistra
  • Diciamo che un robot parta da {7, 3} rivolto verso north. Allora, eseguendo questa sequenza di istruzioni, dovrebbe ritrovarsi in {9, 4} rivolto verso west.

Note sull'implementazione

I test sono divisi in 3 fasi.

Esegui tutti i test con go test oppure esegui test specifici con l'opzione -tags.

Esempi:

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

Ti viene fornito il file sorgente defs.go, che definisce diverse cose richieste dal programma di test. È organizzato in tre sezioni, una per fase.

Fase 1

Per completare la fase 1 dovrai definire Right, Left, Advance, N, S, E, W e Dir. Completa la fase 1 prima di passare alla fase 2.

Fase 2

Per la fase 1 hai implementato i movimenti del robot, ma non è granché come simulazione. Per esempio, dov'è «il robot» nel codice sorgente? Dov'è «la griglia»? Dove sono i calcoli che trasformano le azioni del robot in posizioni sulla griglia, nel robot o nella griglia? Il mondo fisico è diverso.

La fase 2 introduce una «stanza». Sembra una piccola aggiunta, ma faremo grandi cambiamenti per chiarire i ruoli di «stanza», «robot» e «programma di test», e per cominciare a chiarire la fisica della simulazione. Definirai Room e Robot come funzioni che il programma di test «fa nascere» avviandole come goroutine. Le informazioni viaggiano tra programma di test, robot e stanza attraverso i canali di Go.

Pensa a Room come a un «motore fisico», qualcosa che modella e simula una stanza fisica con pareti ed un robot. Dovrebbe in qualche modo modellare lo spazio di coordinate della stanza, la posizione del robot e delle pareti, e garantire, per esempio, che il robot non attraversi le pareti. Vogliamo che Robot sia un agente che esegue azioni, ma vogliamo che Room mantenga una verità coerente.

Il programma di test crea i canali e avvia sia Room sia Robot. Poi il programma di test invia comandi a Robot. Quando ha finito di inviare comandi, chiude il canale dei comandi. Robot deve accettare i comandi e informare Room delle azioni che sta tentando di compiere. Quando rileva che il canale dei comandi si sta chiudendo, deve spegnersi. La stanza deve interpretare le conseguenze fisiche delle azioni del robot. Quando rileva che il robot si sta spegnendo, invia un rapporto finale al programma di test, indicando la posizione e la direzione finali del robot.

Fase 3

La fase 3 introduce tre cambiamenti importanti:

  • I robot eseguono script invece di rispondere a singoli comandi.
  • Un canale di log permette ai robot ed alla stanza di registrare messaggi.
  • La stanza permette a più robot di esistere e operare in modo concorrente.

Per il rapporto finale sulla posizione inviato da Room3, puoi restituire la stessa slice ricevuta dal canale dei robot, semplicemente con posizioni e direzioni aggiornate. Bisogna inviare un messaggio sul canale di log per

  • Un robot senza nome
  • Nomi di robot duplicati
  • Robot posizionati nello stesso punto
  • Un robot posizionato fuori dalla stanza
  • Un comando non definito in uno script
  • Un'azione da un robot sconosciuto
  • Un robot che tenta di avanzare contro un muro
  • Un robot che tenta di avanzare contro un altro robot

Fonte

Ispirato a una domanda di colloquio presso un'azienda famosa.
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Go Exercism

Vuoi iniziare Simulatore di robot?

Iscriviti a Exercism per imparare e padroneggiare Go con 34 concetti165 esercizi e il mentoring di persone reali, tutto gratis.