6. tréningové zadanie - skúška z 5.2.2018 - Robot Mravec

Máme cvičeného malého robota mravca, ktorý sa pohybuje po štvorcovej sieti a pritom vie pred sebou tlačiť malé kocky. Mravec poslúcha na povely 'l' (vľavo), 'p' (vpravo), 'h' (hore), 'd' (dole), pričom sa v danom smere posunie na susedné políčko štvorcovej siete. Ak sa v danom smere nachádza kocka, tak ju pred sebou v tomto smere potlačí. Ak je v danom smere tesne za sebou viac kociek, tak ich tlačí všetky. Mravec z plochy nikdy nevyjde, hoci kocky, ktoré pred sebou tlačí, z plochy vypadnúť môžu.

Na každej kocke je zapísané jedno písmeno. Samotná štvorcová sieť vie indikovať, či sa na niektorých špeciálnych políčkach nachádzajú kocky s písmenami a vie zistiť množinu písmen na týchto kockách.

Zadanie štvorcovej siete s počiatočným rozložením kociek je v textovom súbore. V prvých riadkoch tohto súboru sú nachádzajú riadky štvorcovej siete (všetky sú rovnako dlhé), pričom voľné políčka sú označené znakom '.' a iné znaky označujú kocky s týmito znakmi. Za štvorcovou sieťou je v súbore jeden riadok prázdny a za tým nasleduje postupnosť súradníc špeciálnych políčok - v každom ďalšom riadku je dvojica celých čísel, ktorá označuje riadok a stĺpec jedného takéhoto políčka (číslujeme od 0).

Naprogramujte triedu Mravec:

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

    def __str__(self):
        return ''

    def start(self, riadok, stlpec):
        ...

    def rob(self, prikazy):
        ...

    def zisti(self):
        return set()

kde

  • init prečíta súbor - mravec tam zatiaľ nie je

  • start položí mravca na zadaný riadok a stĺpec

  • __str__ vráti znakovú reprezentáciu plochy: pozíciu mravca zapíšte znakom '@' a špeciálne políčka, na ktorých sa nenachádza ani mravec ani kocka, zapíšte znakom '+'

  • rob dostáva jeden povel, alebo postupnosť za sebou nasledujúcich povelov, pričom povel je jedno z písmen 'l', 'p', 'h' alebo 'd'; mravec sa postupne pohybuje v daných smeroch, pričom pred sebou môže tlačiť kocky; povely, ktoré sa nedajú vykonať, ignoruje

  • metóda zisti vráti množinu písmen na špeciálnych políčkach hracej plochy

Napr. pre súbor:

.....
.A.B.
.CD..
.....

1 2
1 4
2 1
2 2

takýto test:

if __name__ == '__main__':
    m = Mravec('subor1.txt')
    print(m)
    print('zisti =', m.zisti())
    m.start(1, 0)
    m.rob('pp')
    print(m)
    print('zisti =', m.zisti())
    m.rob('dl')
    print(m)
    print('zisti =', m.zisti())

vypíše:

.....
.A+B+
.CD..
.....
zisti = {'D', 'C'}
.....
..@AB
.CD..
.....
zisti = {'B', 'D', 'C'}
.....
..+AB
C@+..
..D..
zisti = {'B'}

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.