Zadanie skúšky z 14.2.2019 - Robot Karel na schodoch

Robot Karel sa pohybuje po štvorcovej sieti, v ktorej sa na niektorých políčkach nachádzajú kvádre pevnej výšky (tzv. stupienky), pričom kvádrov môže byť aj niekoľko na sebe. Robot prechádza po týchto políčkach, ale na susedné prejde len vtedy, keď jeho výška (počet stupienkov) spĺňa nejaké podmienky. Počas chodenia si robot eviduje počet políčok, na ktorých sa nachádzal, pričom do tohto počtu zaráta aj viacnásobné navštívenie toho istého políčka. Robot reaguje na povely 'left', 'right', 'step':

  • robot je natočený v jednom zo štyroch smerov, označovať ich budeme takto: 0 na východ, 1 na juh, 2 na západ, 3 na sever

  • príkazy 'left', resp. 'right' otočia robota v danom smere

  • príkazom 'step' robot prejde v momentálnom smere na susedné políčko; ak je už na okraji siete, z plochy nevypadne, ale v danom smere nevykoná nič; ak je políčko, na ktoré chce stúpiť vyššie viac ako o 1 stupienok (je to pre neho veľmi vysoko), v danom smere nevykoná nič; ak je políčko, na ktoré chce stúpiť nižšie viac ako o 2 stupienky (je to pre neho veľmi hlboko), v danom smere nevykoná nič.

Zadanie štvorcovej siete s rozložením kvádrov je v textovom súbore. Každý riadok súboru popisuje jeden riadok štvorcovej siete. V každom riadku sú čísla od 0 do 9, ktoré vyjadrujú počet kvádrov (stupienkov) na danom políčku. Počet políčok je v každom riadku rovnaký (počet stĺpcov).

Naprogramujte triedu Karel:

class Karel:
    def __init__(self, meno_suboru):
        ...

    def __str__(self):
        return ''

    def robot(self, *param):
        ...

    def rob(self, prikaz):
        ...

    def pocet_navstivenych(self):
        return 0

kde

  • init prečíta súbor - robot tam zatiaľ nie je;

  • __str__ vráti znakovú reprezentáciu navštívených políčok v ploche: nenavštívené políčko zobrazte znakom '.'; znakom '*' zobrazte aspoň raz navštívené políčko; pozíciu robota nezobrazujete;

  • metóda robot je buď zavolaná bez parametrov, vtedy vráti trojicu čísel (pozíciu (riadok, stĺpec) a smer natočenia robota (číslo od 0 do 3)), alebo None, keď robot v ploche ešte nie je; ak je metóda zavolaná s tromi parametrami (tri celé čísla), položí robota na zadaný riadok a stĺpec s daným otočením (číslo od 0 do 3) - toto políčko sa stáva prvým navštíveným; vtedy metóda nevracia nič;

  • rob dostáva jeden povel, alebo postupnosť za sebou nasledujúcich povelov, pričom povel je jeden z reťazcov 'left', 'right', 'step', ktorý môže mať za sebou aj celé číslo, vtedy to označuje počet opakovaní; napr. 'step 3' označuje tri kroky za sebou; robot sa postupne pohybuje v danom smere; povely, ktoré sa nedajú vykonať, ignoruje; funkcia nič nevracia;

  • metóda pocet_navstivenych vráti momentálny počet navštívených políčok.

Napr. pre súbor 'subor1.txt':

00000
02200
00111
00000

takýto test:

if __name__ == '__main__':
    k = Karel('subor1.txt')
    print(k)
    k.robot(3, 1, 0)
    k.rob('step 3')
    k.rob('left')
    k.rob('step')
    k.rob('left step 2')
    k.rob('right step 2 left step 2')
    k.rob('left step left step 4')
    k.rob('right step left step 4 left')
    print(k.robot())
    print(k)
    print('pocet', k.pocet_navstivenych())

vypíše:

.....
.....
.....
.....
(2, 4, 3)
***..
*.*..
*****
.****
pocet 17

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

Aby ste mohli spúšťať skúškové testy, program uložte do súboru skuska.py. Riešenie (bez dátových súborov) odovzdajte na úlohový server https://list.fmph.uniba.sk/.

Praktická časť končí o 11:00 a skúška pokračuje od 12:00 vyhodnotením v kancelárii m162.