Skúška 4.2.2021 - slon a balóny


Cirkusový slon sa predvádza v aréne (štvorcová sieť), v ktorej sa na niektorých políčkach nachádzajú veľké balóny. V každom balóne je ukryté nejaké písmeno malej abecedy. Slonovi dávame povely: vp() pre vpravo, vl() pre vľavo, ho() pre hore, do() pre dole a ten sa v príslušnom smere hýbe po ploche na susedné políčko (na okraji plochy zastane a tiež aj na prekážke). Ak má pri pohybe v danom smere pred sebou balón, tak ho tlačí pred sebou. Ak ich je v danom smere viac, tlačí ich všetky. Ak niektorý z tlačených balónov je vytlačený za okraj, alebo zatlačený na prekážku, balón praskne (zmizne z plochy) a písmeno, ktoré v ňom bolo ukryté, získava slon (ako výsledok operácie).

Celá mapa arény aj s vyznačenými balónmi (pomocou písmen, ktoré sú v nich ukryté) je zaznačená do štvorcovej siete: každé políčko je buď prázdne (budeme značiť '.'), je tam stena, teda prekážka (budeme značiť 'M'), alebo balón s ukrytým písmenom (budeme zobrazovať 'o'). Štruktúra súboru s popisom arény je nasledovná:

  • v každom riadku je jeden riadok štvorcovej siete - všetky majú rovnakú dĺžku

  • pozícia slona je označená znakom '@'

  • môžeš predpokladať, že súbor je zadaný korektne

Napríklad pre 'subor1.txt':

........
...M....
.@.ab.cd
....e..M
........

aréna so slonom by sa zobrazila takto:

........
...M....
.@.oo.oo
....o..M
........

Napíš metódy triedy Balony:

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

    def __str__(self):
        return ''

    def vl(self, pocet=1):
        return ''

    def vp(self, pocet=1):
        return ''

    def ho(self, pocet=1):
        return ''

    def do(self, pocet=1):
        return ''

    def vsetky(self):
        return ''

kde metóda:

  • init(meno_suboru) - prečíta súbor s popisom arény

  • __str__() - vráti znakový reťazec, ktorý reprezentuje stav arény so slonom: prázdne políčka zobrazuje ako '.', prekážky ako 'M', balóny ako 'o' a momentálnu pozíciu slona ako '@'

  • vl(pocet), vp(pocet), ho(pocet), do(pocet) - riadi slona v danom smere, pričom parameter pocet označuje, koľkokrát prejde v danom smere (ak sa dá); funkcia vráti reťazec získaných písmen z balónov v tomto kroku

  • vsetky() - vráti reťazec všetkých získaných písmen zo všetkých doterajších príkazov pohybu

Napríklad, takýto test:

b = Balony('subor1.txt')
print(b)
print(f'pohyb = {b.vp(3)+b.do(3)!r}')
print(b)
print(f'pohyb = {b.ho(3)+b.vp(4)+b.do()+b.vl(10)!r}')
print(b)
print(f'vsetky = {b.vsetky()!r}')

vypíše:

........
...M....
.@.oo.oo
....o..M
........
pohyb = 'de'
........
...M....
.....ooo
.......M
....@...
pohyb = 'cab'
........
...M....
@.......
.......M
........
vsetky = 'decab'

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', …, ktoré bude používať aj 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: balony
# autor: Janko Hraško
# datum: 4.2.2021