Skúška 15.1.2020 - Cestovateľ objavuje ostrovy


Cestovateľ putuje pešo po ostrovných štátoch, ktoré tvoria nejaké súostrovie. To, že putuje pešo, označuje, že z ostrova na ostrov sa môže dostať len, ak je medzi nimi vybudovaný most. Našťastie, my máme takú moc, že budovať, alebo búrať mosty môžeme aj počas toho, ako cez nich prechádza Cestovateľ. Samozrejme, že tú malú časť mosta, na ktorej práve stojí Cestovateľ, zbúrať nemôžeme. Názvy jednotlivých štátov, ktoré sa nachádzajú na častiach ostrovov, budeme označovať malými písmenami 'a''z'

Celá mapa súostrovia aj so zakreslenými mostami je zaznačená do štvorcovej siete: na každom políčku je buď časť ostrova (patriaca nejakému štátu), alebo je to more (pre Cestovateľa nepriechodné políčko) alebo časť mosta. Mapa môže v súbore vyzerať napríklad takto 'subor1.txt':

.+dd.......
.+.aadd....
.+....dd...
.++ab......
..aaab.....
..aaabb....
..abbb.....
...bb..cc..
......cccc.
4 2

kde

  • '.' označuje more

  • '+' označuje most

  • malé písmená označujú časti ostrovov aj s názvom štátu

  • posledný riadok súboru označuje pozíciu (riadok, stĺpec) Cestovateľa, riadky aj stĺpce číslujeme od 0

Napíš metódy triedy Cestovateľ:

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

    def __str__(self):
        return ''

    def chod(self, prikazy):
        return 0

    def most(self, *pozicia):
        ...

    def kde_bol(self):
        return set()

kde metóda:

  • init(meno_suboru) - prečíta súbor s mapou, v ktorom je v poslednom riadku pozícia Cestovateľa

  • __str__() - vráti znakový reťazec, ktorý reprezentuje stav mapy a Cestovateľa: navštívené pozície ostrovov ako 'O', mosty ako '+', more ako '.', nenavštívené časti ostrovov ako písmeno s názvom štátu a momentálna pozícia Cestovateľa ako '@'

  • chod(prikazy) - dostane postupnosť príkazov pre Cestovateľa, ktoré sú v jednom z 'v' (ide na východ), 'j' (ide na juh), 'z' (ide na západ) a 's' (ide na sever); príkazy, ktoré sa nedajú vykonať ignoruje; funkcia vráti počet prejdených krokov

  • def most(*pozicia) - dostane pozície (riadok, stĺpec) v mape, kde treba postaviť, resp. zbúrať most; metóda na políčku, kde je voda, postaví most a na pozícii, kde je most (a práve na ňom nie je Cestovateľ) tento zbúra; zvyšné zadané pozície ignoruje

  • kde_bol() - vráti množinu názvov navštívených štátov

Napríklad takýto test:

c = Cestovatel('subor1.txt')
print(c)
print('presiel', c.chod('vvsszzzzj'), 'krokov')
print(c)
print('navstivil:', c.kde_bol())

vypíše:

.+dd.......
.+.aadd....
.+....dd...
.++ab......
..@aab.....
..aaabb....
..abbb.....
...bb..cc..
......cccc.
presiel 6 krokov
.+dd.......
.+.aadd....
.+....dd...
.@+OO......
..OOOb.....
..aaabb....
..abbb.....
...bb..cc..
......cccc.
navstivil: {'b', 'a'}

Z úlohového servera L.I.S.T. si stiahni kostru programu skuska.py. Pozri si testovacie dáta v súboroch 'subor1.txt' a 'subor2.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/.

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