Skúška 20.1.2020 - Cestovateľ v džungli


Cestovateľ sa rozhodol skúmať džungľu a najmä zvieratá, ktoré v nej žijú. V džungli sa môže pohybovať len po chodníkoch a v žiadnom prípade z nich nesmie vstúpiť do lesa. Okrem putovania džungľou Cestovateľ sleduje všetky zvery, ktoré sa dostanú do jeho zorného poľa. Celá plocha džungle má obdĺžnikový tvar a rozdelili sme ho na políčka štvorcovej siete. Každé políčko je buď chodník (označujeme ich znakom '*'), alebo je to časť lesa. Plán džungle môže v súbore vyzerať, napríklad takto 'subor1.txt':

|-\--\---------------*--------------/--/--|
|  \  \              *             /  /   |
|   \  \    *******************   /  /    |
|    \  \   *   <<<<<         ************|
*************          >>>>>  * /  /      |
|      \  \ *******************/  /       |
|       \  \             *    /  /        |
|--------\--\------------*---/--/---------|

V tomto pláne nie sú zaznačené žiadne zvieratá ani pozícia cestovateľa. Zvieratá sa budú môcť v ploche presúvať, preto bude treba zabezpečiť, aby sa zachoval pôvodný obsah políčok. Napíš metódy triedy Dzungla:

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

    def __str__(self):
        return ''

    def chod(self, prikazy):
        return 0

    def zviera(self, znak, pozicia):
        ...

    def koho_videl(self):
        return set()

kde metódy:

  • init(meno_suboru, pozicia) - prečíta súbor s plánom džungle, v druhom parametri je pozícia Cestovateľa (riadok, stĺpec)

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

  • chod(prikazy) - dostane postupnosť príkazov pre Cestovateľa, ktoré sú jedným z 'v' (ide na východ), 'j' (ide na juh), 'z' (ide na západ), 's' (ide na sever); ak sa príkaz nedá vykonať, ignoruje ho (nesmie ísť mimo chodníka ani stúpiť na zviera); funkcia vráti počet naozaj prejdených krokov

  • zviera(znak, pozicia) - umiestni zviera s daným menom znak na zadanú pozíciu; ak sa zviera s týmto menom už niekde nachádza, tak sa presťahuje na novú pozíciu; ak by sa zviera malo umiestniť na pozíciu Cestovateľa, tak sa tento príkaz ignoruje

  • koho_videl() - vráti množinu zvierat, ktoré sa dostali do zorného poľa; v zornom poli Cestovateľa sú všetky tie políčka plánu džungle, ktoré sú v tom istom riadku, resp. stĺpci ako je pozícia Cestovateľa

Napríklad, takýto test:

d = Dzungla('subor1.txt', (5, 17))
d.zviera('E', (2, 34))
d.zviera('F', (4, 25))
d.zviera('G', (6, 21))
print(d)
print('presiel', d.chod('vvvvvvvvvvvvvvvvvvvvv'), 'krokov')
print(d)
print('videl', d.koho_videl())
d.zviera('F', (2, 20))
d.zviera('H', (0, 36))
print('presiel', d.chod('sssssszzzzzzzzzzzzsssss'), 'krokov')
print(d)
print('videl', d.koho_videl())

vypíše:

|-\--\---------------*--------------/--/--|
|  \  \              *             /  /   |
|   \  \    *******************   E  /    |
|    \  \   *   <<<<<         ************|
*************          >>F>>  * /  /      |
|      \  \ *****@*************/  /       |
|       \  \         G   *    /  /        |
|--------\--\------------*---/--/---------|
presiel 13 krokov
|-\--\---------------*--------------/--/--|
|  \  \              *             /  /   |
|   \  \    *******************   E  /    |
|    \  \   *   <<<<<         ************|
*************          >>F>>  * /  /      |
|      \  \ ******++++++++++++@/  /       |
|       \  \         G   *    /  /        |
|--------\--\------------*---/--/---------|
videl {'G', 'F'}
presiel 14 krokov
|-\--\---------------@--------------H--/--|
|  \  \              +             /  /   |
|   \  \    ********F++++++++++   E  /    |
|    \  \   *   <<<<<         +***********|
*************          >>>>>  + /  /      |
|      \  \ ******+++++++++++++/  /       |
|       \  \         G   *    /  /        |
|--------\--\------------*---/--/---------|
videl {'E', 'G', 'H', 'F'}

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.