Skúška 11.2.2021 - robot umelec


Robot umelec sa pohybuje po špecialnej štvorčekovej ploche, na jednotlivé políčka môže klásť písmenká a tým vytvárať rôzne obrazce. Pohyb na okraji plochy sa riadi špeciálnymi pravidlami (niečo ako teleport v počítačových hrách):

  • ak je robot v najpravejšom stĺpci a dostane povel, že sa má posunúť vpravo, plynulo sa presťahuje na ľavý okraj, ale o riadok nižšie (v spodnom riadku vtedy prejde do prvého)

  • ak je robot v najľavejšom stĺpci a dostane povel, že sa má posunúť vľavo, plynulo sa presťahuje na pravý okraj, ale o riadok vyššie (v hornom riadku vtedy prejde do spodného)

  • ak je robot v dolnom riadku a dostane povel, že sa má posunúť nadol, plynulo sa presťahuje do horného riadku, ale o stĺpec vpravo (v poslednom stĺpci vtedy prejde do prvého)

  • ak je robot v hornom riadku a dostane povel, že sa má posunúť nahor, plynulo sa presťahuje do spodného riadku, ale o stĺpec vľavo (v prvom stĺpci vtedy prejde do posledného)

Môžeš si všimnúť, že povely vpravo a vľavo sa správajú navzájom opačne aj na okraji plochy a rovnako aj povely hore a dole. Ak má plocha rozmery m x n, potom z ľubovoľnej pozície m*n opakovaní ľubovoľného pohybu jedným smerom vráti robota späť do tejto pozície.

Robota budeme riadiť týmito povelmi (každý je v dvoch znakoch):

  • 'p?', kde ? je cifra od '1' do '9' - robot sa posunie o príslušný počet políčok vpravo

  • 'l?', kde ? je cifra od '1' do '9' - robot sa posunie o príslušný počet políčok vľavo

  • 'h?', kde ? je cifra od '1' do '9' - robot sa posunie o príslušný počet políčok hore

  • 'd?', kde ? je cifra od '1' do '9' - robot sa posunie o príslušný počet políčok dole

  • '+?', kde ? je písmeno od 'a' do 'z' - robot položí na políčko, na ktorom stojí, príslušné písmeno

  • '+.' - robot z políčka, na ktorom stojí, zmaže prípadné písmeno

Štvorčeková plocha je zadaná v textovom súbore:

  • v prvom riadku sú rozmery plochy ako dve celé čísla: počet riadkov a počet stĺpcov

  • v každom ďalšom riadku sa nachádza trojica, ktorá určuje umiestnenie písmena v ploche: písmeno riadok stĺpec

Napíš metódy triedy Umelec:

class Umelec:
    def __init__(self, meno_suboru, pozicia):
        ...

    def __str__(self):
        return ''

    def rob(self, retazec, kolkokrat=1):
        return 0

    def poloz(self, pismeno, pozicia):
        ...

kde metóda:

  • __init__(meno_suboru, pozicia) - prečíta súbor s popisom plochy a pozíciou robota

  • __str__() - vráti znakový reťazec, ktorý reprezentuje stav plochy s robotom: prázdne políčka zobrazuje ako '.' a momentálnu pozíciu robota ako '@'

  • rob(retazec, kolkokrat) robot vykoná povely zadané v parametri retazec toľkokrát ako je v parametri kolkokrat; metóda vráti počet krokov (posunov), ktoré sa práve teraz vykonali

  • poloz(pismeno, pozicia) položí na zadané súradnice (parameter pozicia je dvojica riadok, stĺpec) zadané písmeno; ako písmeno môže byť zadané aj '.' (vymaže prípadné písmeno)

Napríklad pre 'subor1.txt':

5 12
r 0 5
t 4 9
o 1 6
o 3 8
b 2 7

a takýto test:

u = Umelec('subor1.txt', (1, 3))
print(u)
print('pocet krokov =', u.rob('+ap1', 5))
print(u)
print('pocet krokov =', u.rob('p2+xd1', 10))
print(u)

vypíše:

.....r......
...@..o.....
.......b....
........o...
.........t..
pocet krokov = 5
.....r......
...aaaaa@...
.......b....
........o...
.........t..
pocet krokov = 30
.x...x......
...xaaax..x.
.....x.b.x..
x....@..o..x
..x......t..

Z úlohového servera L.I.S.T. si stiahni kostru programu skuska.py. Pozri si testovacie dáta v súboroch 'subor1.txt', 'subor2.txt', …, ktoré bude používať aj testovač.

Aby si mohol spúšťať skúškové testy, program ulož do súboru skuska.py. Riešenie (bez dátových súborov) odovzdaj na úlohový server https://list.fmph.uniba.sk/. Tvoj odovzdaný program musí začínať tromi riadkami komentárov:

# 3. skuska: umelec
# autor: Janko Hraško
# datum: 11.2.2021