Kurzusok
/
Go
Go
/
Feladatok
/
Robotszimulátor
Robotszimulátor

Robotszimulátor

Közepes

Utasítások

Írj egy robotszimulátort.

Egy robotgyár tesztlétesítményének egy programra van szüksége, amely ellenőrzi a robotok mozgását.

A robotok háromféleképpen mozoghatnak:

  • jobbra fordul
  • balra fordul
  • előrelép

A robotokat egy képzeletbeli, végtelen rácsra helyezik, adott irányba (észak, kelet, dél vagy nyugat) nézve, egy {x,y} koordinátapáron, például {3,8}; a koordináták észak és kelet felé nőnek.

A robot ezután egy sor utasítást kap, ekkor a tesztlétesítmény ellenőrzi a robot új pozícióját, és azt, hogy milyen irányba néz.

  • A „RAALAL” betűsorozat a következőt jelenti:
    • Jobbra fordul
    • Kétszer előrelép
    • Balra fordul
    • Egyszer előrelép
    • Ismét balra fordul
  • Tegyük fel, hogy egy robot a {7, 3} pontról indul, észak felé nézve. Ha lefuttatjuk ezt az utasítássorozatot, akkor a {9, 4} ponton kell végeznie, nyugat felé nézve.

Megvalósítási megjegyzések

A tesztek 3 lépésre vannak osztva.

Futtasd az összes tesztet a go test paranccsal, vagy futtass meghatározott teszteket a -tags kapcsolóval.

Példák:

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

Kapsz egy defs.go forrásfájlt, amely számos olyan dolgot definiál, amire a tesztprogramnak szüksége van. Három szakaszra van tagolva, lépésenként.

1. lépés

Az 1. lépés teljesítéséhez definiálnod kell a Right, Left, Advance, N, S, E, W és Dir értékeket. Az 1. lépést fejezd be, mielőtt továbblépnél a 2. lépésre.

2. lépés

Az 1. lépésben implementáltad a robot mozgását, de ez még nem igazi szimuláció. Hol van például a forráskódban „a robot”? Hol van „a rács”? Hol vannak azok a számítások, amelyek a robot műveleteit rácspozíciókká alakítják: a robotban vagy a rácsban? A fizikai világ más.

A 2. lépés bevezet egy „szobát”. Kicsi kiegészítésnek tűnik, de nagy változtatásokat hajtunk végre, hogy tisztázzuk a „szoba”, a „robot” és a „tesztprogram” szerepét, és elkezdjük tisztázni a szimuláció fizikáját. A Room és a Robot függvényeket fogod definiálni, amelyeket a tesztprogram goroutine-ként való elindításával „kelt életre”. Az információ a tesztprogram, a robot és a szoba között Go-csatornákon keresztül mozog.

Gondolj a Roomra úgy, mint egy „fizikai motorra”, amely modellezi és szimulál egy falakkal és egy robottal rendelkező fizikai szobát. Valahogy modelleznie kell a szoba koordinátaterét, a robot és a falak helyét, és biztosítania kell például azt, hogy a robot ne sétáljon át a falakon. Azt szeretnénk, hogy a Robot műveleteket végrehajtó ügynök legyen, de azt is, hogy a Room fenntartsa a koherens igazságot.

A tesztprogram létrehozza a csatornákat, és elindítja a Roomot és a Robotot is. A tesztprogram ezután parancsokat küld a Robotnak. Amikor végzett a parancsok küldésével, lezárja a parancscsatornát. A Robotnak fogadnia kell a parancsokat, és tájékoztatnia kell a Roomot az általa megkísérelt műveletekről. Amikor érzékeli, hogy a parancscsatorna zárul, le kell állítania magát. A szobának értelmeznie kell a robot műveleteinek fizikai következményeit. Amikor érzékeli, hogy a robot leáll, egy záró jelentést küld vissza a tesztprogramnak, amely megadja a robot végső pozícióját és irányát.

3. lépés

A 3. lépés három jelentős változást hoz:

  • A robotok szkripteket futtatnak ahelyett, hogy egyedi parancsokra reagálnának.
  • Egy naplócsatorna lehetővé teszi a robotok és a szoba számára, hogy üzeneteket naplózzanak.
  • A szoba lehetővé teszi, hogy egyszerre több robot létezzen és működjön.

A Room3 által küldött végső pozíciójelentéshez visszaadhatod ugyanazt a szeletet, amelyet a robots csatornától kaptál, csak a frissített pozíciókkal és irányokkal. A naplócsatornán üzenetet kell küldeni a következő esetekben:

  • Név nélküli robot
  • Ismétlődő robotnevek
  • Ugyanarra a helyre helyezett robotok
  • A szobán kívülre helyezett robot
  • Nem definiált parancs egy szkriptben
  • Ismeretlen robottól származó művelet
  • Falba előrehaladni próbáló robot
  • Másik robotba előrehaladni próbáló robot

Forrás

Egy híres cég interjúkérdése ihlette.
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Go Exercism

Készen állsz elkezdeni a(z) Robotszimulátor feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Go nyelvet 34 fogalom165 feladat segítségével, valódi emberi mentorálással, mindez ingyen.