Skúška 18.1.2024 - Robot na schodoch


Robot sa pohybuje po štvorcovej sieti, v ktorej sa na niektorých políčkach nachádzajú kvádre pevnej výšky (stupienky schodov), pričom takýchto 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. Okrem toho si počas chodenia eviduje koľkokrát sa nachádzal na ktorom políčku a aj ich celkový počet (do tohto počtu zaráta aj viacnásobné navštívenie toho istého políčka). Robot reaguje na príkazy '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 o 90 stupňov

  • 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).

Naprogramuj triedu Robot:

class Robot:
    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__(meno_suboru) 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 zobraz znakom '.'; číslom (vyjadruje počet navštívení) zobraz aspoň raz navštívené políčko (tento počet vypisuj ako zvyšok po delení 100); pozíciu robota zobraz znakom '+' (namiesto počtu navštívení);

  • metóda robot(*param) 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č; táto metóda môže byť zavolaná aj viackrát;

  • rob(prikaz) dostáva jeden príkaz, alebo postupnosť príkazov, pričom príkaz 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íklad 'step 3' označuje tri kroky za sebou; robot sa postupne pohybuje v danom smere; príkazy, ktoré sa nedajú vykonať, ignoruje; funkcia nič nevracia;

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

Napríklad, pre súbor 'subor1.txt':

00000
02200
00111
00000

takýto test:

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

vypíše:

 . . . . .
 . . . . .
 . . . . .
 . + . . .
pozicia = (2, 4, 3)
 1 1 1 . .
 1 . 1 . .
 1 1 2 2 +
 . 1 1 1 1
pocet = 17

Alebo test:

if __name__ == '__main__':
    k = Robot('subor1.txt')
    k.robot(2, 0, 3)
    k.rob('step 2 left 2 ' * 11 + 'step 3')
    print(k)

by vypísal:

 6 . . . .
12 . . . .
 7 . . . .
 + . . . .

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', 'subor3.txt', ktoré bude používať 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:

# 2. skuska: robot
# autor: Janko Hraško
# datum: 18.1.2024