Skúška 5.2.2020 - Cestovateľ na vesmírnej stanici


Cestovateľ skúma moduly vesmírnej stanice a zrejme nemôže vystúpiť do otvoreného priestoru. Počas toho, ako sa nachádza vo vesmíre, sa k existujúcej stanici pripájajú nové moduly a vďaka tomu sa Cestovateľovi zväčšujú možnosti skúmania týchto priestorov. Pre účely nášho programu sme časť vesmíru, v ktorej sa nachádzajú moduly vesmírnej stanice, rozdelili na políčka štvorcovej siete. Každé políčko je buď otvorený vesmír (označujeme ho znakom '.'), alebo je to časť nejakého modulu. Moduly budeme označovať malými alebo veľkými písmenami (teda budeme mať maximálne 52 modulov). Plán vesmíru môže v súbore vyzerať, napríklad takto 'subor1.txt':

10 10
G 3 4 5 5
q 7 7 2 3
6 7

kde

  • v prvom riadku je rozmer štvorcovej siete: počet riadkov a stĺpcov

  • v každom ďalšom (okrem posledného) je popis jedného modulu: začína písmenom (označenie modulu), za ktorým sú 4 celé čísla; tieto popisujú umiestnenie modulu v štvorcovej sieti (modul má tvar obdĺžnika): riadok, stĺpec, výška (počet riadkov) a šírka; kde (riadok, stĺpec) je ľavý horný roh modulu (číslujeme od 0) a (výška, šírka) sú rozmery obdĺžnika

  • posledný riadok obsahuje pozíciu Cestovateľa v štvorcovej sieti

  • súbor je korektný, všetky moduly sa celé nachádzajú v zadanej štvorcovej sieti, Cestovateľ sa nachádza vnútri niektorého modulu

Napíš metódy triedy VesmirnaStanica:

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

    def __str__(self):
        return ''

    def pridaj_modul(self, meno, obdlznik):
        ...

    def pohyb(self, prikazy):
        return 0

    def ktore(self):
        return set(), set()

kde metódy:

  • init(meno_suboru) - prečíta súbor s plánom vesmíru a pozíciou Cestovateľa

  • __str__() - vráti znakový reťazec, ktorý reprezentuje stav plánu vesmíru a Cestovateľa, kde navštívené pozície zobrazí ako '+' a momentálnu pozíciu Cestovateľa ako '@'

  • pohyb(prikazy) - dostane postupnosť príkazov pre Cestovateľa, ktoré sú jedným z 'p' (ide vpravo, t.j. na východ), 'd' (ide dolu, t.j. na juh), 'l' (ide vľavo, t.j. na západ), 'h' (ide hore, t.j. na sever); ak sa príkaz nedá vykonať, ignoruje ho (nesmie ísť mimo modulov); funkcia vráti počet naozaj prejdených krokov

  • pridaj_modul(meno, obdlznik) - umiestni ďalší modul do štvorcovej siete, obdĺžnik je definovaný ako štvorica celých čísel (s rovnakým významom ako vo vstupnom textovom súbore), meno je písmenové označenie modulu; moduly sa môžu nielen dotýkať ale aj prekrývať, vtedy označenie nového modulu, prekryje časť pôvodného modulu; takto sa môže Cestovateľ aj bez pohybu dostať do ďalšieho modulu

  • ktore() - vráti dve množiny označení modulov: moduly, ktoré navštívil a moduly, v ktorých ešte nebol

Napríklad, takýto test:

if __name__ == '__main__':
    v = VesmirnaStanica('subor1.txt')
    print(v)
    v.pridaj_modul('X', (1, 2, 4, 2))
    print('pohyb:', v.pohyb('pphhhhh'))
    v.pridaj_modul('A', (2, 7, 2, 3))
    print('pohyb:', v.pohyb('dllllld'))
    print(v)
    print(v.ktore())

vypíše:

..........
..........
..........
....GGGGG.
....GGGGG.
....GGGGG.
....GGG@G.
....GGGqqq
.......qqq
..........
pohyb: 4
pohyb: 6
..........
..XX......
..XX...AAA
..XXGGGA+A
..X@+++++.
....GGGG+.
....GGG++.
....GGGqqq
.......qqq
..........
({'A', 'X', 'G'}, {'q'})

Z úlohového servera L.I.S.T. si stiahni kostru programu skuska.py. Pozri si testovacie dáta v súboroch 'subor1.txt', …, ktoré bude používať 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/.

Praktická časť končí o 11:00 a skúška pokračuje od 12:00 vyhodnotením v kancelárii m162.