5. tréningové zadanie - skúška z 24.1.2018 - Čistiaci robot

Keďže v priemyselnom parku treba niektoré plochy čistiť každý deň, vlastníci sa rozhodli nainštalovať čistiaceho robota. Robot má nejakú svoju počiatočnú polohu a tiež smer, v ktorom je natočený (predpokladáme plánik, ktorý je zakreslený do štvorcovej siete). V danom smere sa pohybuje samostatne, kým nepríde ku nejakej prekážke, alebo na okraj priemyselného parku. Pri svojom pohybe, vyčistí každé políčko štvorcovej siete. Lenže niektoré políčka sú tak intenzívne zašpinené, že robot cez ne musí prejsť aspoň dvakrát, aby sa naozaj očistili. Keď robot pri svojom upratovaní narazí na prekážku (aj okraj plochy je prekážkou), tak zastane a očakáva zadanie jedného z povelov:

  • 'l' otočí sa vľavo vbok (o 90 stupňov) a pokračuje v upratovaní v tomto novom smere;

  • 'p' otočí sa vpravo vbok (o 90 stupňov) a pokračuje v upratovaní v tomto novom smere;

  • 'z' otočí sa čelom vzad (o 180 stupňov) a pokračuje v upratovaní v tomto novom smere;

Robot skončí (zastane), keď už nedostáva ďalšie príkazy.

Zadanie plániku pre robota je v textovom súbore, v ktorom v každom riadku je jeden riadok štvorcovej siete (všetky riadky sú rovnako dlhé), pričom jednotlivé znaky majú tento význam:

  • '.' voľné políčko

  • 'X' políčko s prekážkou

  • '1' znečistené políčko

  • '2' dvojnásobne znečistené políčko

Naprogramujte triedu Robot:

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

    def start(self, riadok, stlpec, smer):
        return 0

    def __str__(self):
        return ''

    def rob(self, povely):
        return 0

    def pocet_znecistenych(self):
        return 0

kde

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

  • start položí robota na zadaný riadok a stĺpec, natočí ho v jednom zo 4 smerov: 0 na sever, 1 na východ, 2 na juh, 3 na západ; môžete počítať s tým, že toto štartové políčko je voľné (obsahuje '.'); zároveň sa robot daným smerom rozbehne a zastane až na prekážke; metóda vráti počet znečistených políčok, ktoré musel pritom očistiť

  • __str__ vráti znakovú reprezentáciu plochy: políčka, ktoré úplne očistil označí 'o', políčka s '2', cez ktoré prešiel len raz, označí '1', pozíciu robota zapíšte podľa jeho momentálneho smeru natočenia jedným zo znakov '^' pre sever, '>' pre východ, 'v' pre juh a '<' pre západ

  • rob dostáva jeden povel, alebo postupnosť za sebou nasledujúcich povelov, pričom povel je jedno z písmen 'l', 'p' alebo 'z'; metóda vráti počet znečistených políčok, ktoré musel pritom očistiť (možno niektoré aj dvakrát)

  • pocet_znecistenych metóda vráti počet znečistených olíčok, ktoré sa nachádzajú v celej ploche (dvojnásobne znečistené počítame dvakrát)

Napr. pre súbor:

XXXXXXXXXX
.....1...X
.........X
...2.....X

takýto test:

if __name__ == '__main__':
    r = Robot('subor1.txt')
    print(r)
    print('pocet znecistenych =', r.pocet_znecistenych())
    print('start(2, 3, 1) vratil', r.start(2, 3, 1))
    print(r)
    print('pocet znecistenych =', r.pocet_znecistenych())
    print("rob('ll') vratil", r.rob('ll'))
    print(r)
    print('pocet znecistenych =', r.pocet_znecistenych())
    print("rob('pzl') vratil", r.rob('pzl'))
    print(r)
    print('pocet znecistenych =', r.pocet_znecistenych())
    print("rob('pp') vratil", r.rob('pp'))
    print(r)
    print('pocet znecistenych =', r.pocet_znecistenych())

vypíše:

XXXXXXXXXX
.....1...X
.........X
...2.....X
pocet znecistenych = 3
start(2, 3, 1) vratil 0
XXXXXXXXXX
.....1...X
...ooooo>X
...2.....X
pocet znecistenych = 3
rob('ll') vratil 1
XXXXXXXXXX
<ooooooooX
...ooooooX
...2.....X
pocet znecistenych = 2
rob('pzl') vratil 1
XXXXXXXXXX
oooooooooX
o..ooooooX
ooo1oooo>X
pocet znecistenych = 1
rob('pp') vratil 1
XXXXXXXXXX
oooooooooX
o..ooooooX
<ooooooooX
pocet znecistenych = 0

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.