Zadanie skúšky z 1.2.2019 - 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

    def co_pozbieral(self):
        return []

kde metódy:

  • __init__(meno_suboru, pozicia):

    • prečíta textový súbor a vytvorí hraciu plochu pre robota; súbor v prvom riadku obsahuje dve celé čísla - rozmer plochy a v každom ďalšom 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é

    • 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 'E'

  • 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 počet 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. pre súbor 'subor1.txt':

4 6
a 2 1
b 0 4
c 3 1
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('pozbieral', e.rob('vjzsjzsvjz'))
    print(e)
    print(e.co_pozbieral())

vypíše:

..M.bM
..E...
.a.M..
.c...M
pozbieral 3
..M..M
......
...M..
E....M
['b', 'c', 'a']

Z úlohového servera L.I.S.T. si stiahnite kostru programu skuska.py. Pozrite si testovacie dáta v súboroch 'subor1.txt', 'subor2.txt', 'subor3.txt', …, ktoré bude používať testovač.

Aby ste mohli spúšťať skúškové testy, program uložte do súboru skuska.py. Riešenie (bez dátových súborov) odovzdajte 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.