Skúška 8.2.2024 - Robot Emil


Robot Emil sa veľmi sa podobá na robota Karla:

  • robot sa pohybuje v štvorcovej sieti, v ktorej sa môžu na niektorých políčkach nachádzať prekážky a na niektorých iných zase nejaké predmety s písmenami

  • robot sa pohybuje v jednom zo štyroch smerov vždy až po najbližšiu prekážku, resp. okraj plochy, pri svojom pohybe vyzbiera všetky predmety z políčok, cez ktoré prejde, smery určujeme písmenami:

    • v = pohybuje sa v smere na východ

    • j = pohybuje sa v smere na juh

    • z = pohybuje sa v smere na západ

    • s = pohybuje sa v smere na sever

Trieda RobotEmil:

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

    def __str__(self):
        return ''

    def rob(self, prikazy):
        return 0, set()

    def co_pozbieral(self):
        return []

kde metódy:

  • __init__(meno_suboru, pozicia):

    • prečíta textový súbor a vytvorí hraciu plochu pre robota

    • v každom riadku súboru je trojica: znak riadok stĺpec

      • znak 'M' označuje prekážku, malé písmená označujú predmety, ktoré bude Emil zbierať, ostatné políčka sú pre Emila voľné

    • rozmer hracej plochy vypočítaš z týchto trojíc tak, že výškou bude maximálny riadok a šírkou bude maximálny stĺpec (keďže riadky aj stĺpce indexujeme od 0, zrejme rozmery musíš zvoliť o 1 väčšie ako maximálne hodnoty)

    • parameter pozicia je dvojica celých čísel: riadok a stĺpec pozície robota v ploche (táto pozícia je voľné políčko - bez predmetu a prekážky)

  • __str__():

    • vráti znakový reťazec - reprezentáciu plochy Emila: prázdne políčka znakom '.', pozícia robota znakom '@'

  • rob(prikazy):

    • vykoná postupnosť príkazov - vždy ide daným smerom, kým sa dá

      • 'v' - pôjde na východ

      • 'j' - pôjde na juh

      • 'z' - pôjde na západ

      • 's' - pôjde na sever

      • iné písmená ignoruje

    • vráti dvojicu: počet krokov, ktoré práve vykonal a množinu (set) zozbieraných predmetov touto postupnosťou príkazov

  • co_pozbieral():

    • vráti zoznam (list) zozbieraných predmetov (malé písmená) v poradí, v ktorom ich zbieral

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

a 2 1
b 0 4
c 3 1
a 0 0
M 0 2
M 0 5
M 2 3
M 3 5

takýto test:

if __name__ == '__main__':
    e = RobotEmil('subor1.txt', (1, 2))
    print(e)
    print('kroky a pozbierane:', *e.rob('vjzsjz'))
    print(e)
    print('kroky a pozbierane:', *e.rob('svjv'))
    print(e)
    print('postupne:', *e.co_pozbieral())

vypíše:

a.M.bM
..@...
.a.M..
.c...M
kroky a pozbierane: 14 {'b', 'c'}
a.M..M
......
.a.M..
@....M
kroky a pozbierane: 10 {'a'}
..M..M
......
...M..
....@M
postupne: b c a 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', '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:

# 5. skuska: Robot Emil
# autor: Janko Hraško
# datum: 8.2.2024