Skúška 17.1.2020 - Cestovateľ na letisku


Cestovateľ prišiel na veľké letisko a je nadšený z množstva pohyblivých chodníkov. Chce ich otestovať čo najviac, preto na nich naskakuje z rôznych strán. Pritom zistil, že keď sa už nachádza na nejakom pohyblivom chodníku, nedá sa z neho zoskočiť, ale treba putovať len v jeho smere pohybu až na jeho koniec (na políčko za koncom chodníka). Celá letisková plocha má obdĺžnikový tvar a rozdelili sme ho na políčka štvorcovej siete. Každé políčko je buď voľná plocha (označujeme ich znakom '.'), alebo je to časť pohyblivého chodníka. Pohyblivé chodníky budeme označovať znakmi '>', 'v', '<' a '^', ktoré majú tento význam:

  • '>' - časť chodníka, ktorý sa hýbe smerom na východ

  • 'v' - časť chodníka, ktorý sa hýbe smerom na juh

  • '<' - časť chodníka, ktorý sa hýbe smerom na západ

  • '^' - časť chodníka, ktorý sa hýbe smerom na sever

Zrejme, keď sa pohyblivý chodník skladá z viacerých nadväzujúcich častí, tak Cestovateľ sa tu pohybuje len v danom smere bez ohľadu, ktorým smerom sa chce pohybovať (aj keby kráčal na mieste).

Plán letiskovej haly môže v súbore vyzerať, napríklad takto 'subor1.txt':

10 12
2 8 < 6
4 9 v 5
3 2 v 5
9 1 > 6
6 5

kde

  • v prvom riadku sú rozmery haly: počet riadkov a stĺpcov štvorcovej siete

  • v každom ďalšom (okrem posledného) sú 4 hodnoty, ktoré definujú pohyblivý chodník:

    • prvé dve celé čísla označujú začiatočnú pozíciu chodníka (riadok, stĺpec) - riadky aj stĺpce číslujeme od 0

    • nasleduje znak pohyblivého chodníka: jeden z: '>', 'v', '<', '^'

    • štvrtá hodnota je dĺžka chodníka

  • napríklad, riadok 2 8 < 6 označuje: chodník začína na pozícii (2, 8), keďže je zložený zo znaku '<', ide z východu na západ, teda prvý znak je na pozícii (2, 8), ďalší jeho znak je na pozícii (2, 7), ďalší (2, 6), atď. až posledný šiesty znak je na pozícii (2, 3)

  • posledný riadok súboru obsahuje len dve celé čísla a to je pozícia Cestovateľa - táto štartová pozícia je určite mimo pohyblivého chodníka

Napíš metódy triedy Letisko:

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

    def __str__(self):
        return ''

    def chod(self, prikazy):
        return 0

    def kolko(self):
        return set()

kde metódy:

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

  • __str__() - vráti znakový reťazec, ktorý reprezentuje stav plánu haly a Cestovateľa, kde navštívené pozície haly zobrazí ako '+' (okrem pohyblivých chodníkov) a momentálnu pozícia Cestovateľa ako '@'

  • chod(prikazy) - dostane postupnosť príkazov pre Cestovateľa, ktoré, ak sú jedným z 'v' (ide na východ), 'j' (ide na juh), 'z' (ide na západ), 's' (ide na sever), inak kráča na mieste; ak sa príkaz nedá vykonať, ignoruje ho; ak sa Cestovateľ nachádza na pohyblivom chodníku, ľubovoľný príkaz ho posunie v smere pohybu chodníka na nasledovné políčko; funkcia vráti počet krokov, ktorými zmenil pozíciu

  • kolko() - vráti celkový počet krokov prejdených na pohyblivých chodníkoch, t.j. Cestovateľ je na pohyblivom chodníku a urobí kroky (hoci aj na mieste)

Napríklad, takýto test:

l = Letisko('subor1.txt')
print(l)
print('presiel', l.chod('vvvvvvvvvvzzzzzss'), 'krokov')
print(l)
print('na chodnikoch kracal', l.kolko())

vypíše:

............
............
...<<<<<<...
..v.........
..v......v..
..v......v..
..v..@...v..
..v......v..
.........v..
.>>>>>>.....
presiel 16 krokov
............
............
...<<<<<<...
..v.........
..v......v..
..v......v..
..v..++++v..
..v......v..
.......@.v..
.>>>>>>+++++
na chodnikoch presiel 4

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