1. tréningové zadanie - skúška z 16.1.2017 - Harry Potter a preskakovadlá

Na čarodejníckom hrade Harryho Pottera (hracia plocha v tvare v štvorcovej siete) sa na niektorých políčkach nachádzajú magické preskakovadlá. Keď sa Harry rozbehne a z niektorého smeru na takéto políčko stúpi, tak ho to môže o niekoľko políčok prehodiť - ale len v danom smere. Každé preskakovadlo má na sebe číslo, ktoré označuje, o koľko políčok Harry preletí. Ak by ale v danom smere Harry vyletel z plochy, alebo sa objavil v stene, preskakovadlo nemá v tomto smere žiaden účinok a teda je to ako obyčajné políčko bez čísla. Ak pri preskoku skočíme na ďalšie preskakovadlo, tak aj ono nás môže presunúť na ďalšie políčko (samozrejme v tom istom smere ale so svojou dĺžkou skoku), atď.

Harry pri prechádzaní hradu (pomocou šípok 'l' vľavo, 'p' vpravo, 'h' hore, 'd' dole), okrem preskakovania zbiera aj všetky magické predmety, ktoré nájde na svojej ceste (stúpi na toto políčko). Aj pri presune pomocou preskakovadla môže skočiť na predmet a ten samozrejme musí tiež zdvihnúť.

Cieľom v programu je odsledovať, kam sa Harry po zadanej postupnosti šípok dostane a koľko predmetov pritom zozbiera.

Textový súbor popisuje hraciu plochu (hrad) ako štvorcovú sieť (všetky riadky sú rovnako dlhé). Znaky v súbore majú tento význam:

  • čísla od '1' do '9' sú preskakovadlá

  • 'o' je predmet

  • 'x' je stena

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

Vašou úlohou je prečítať textový súbor s popisom hradu a odsimulovať zadanú postupnosť stláčaných šípok. Samotný pohyb hráča sa bude riadiť podľa týchto pravidiel:

  • šípka na voľné políčko (prípadne s predmetom) presunie hráča (a zdvihne predmet)

  • šípka na políčko so stenou, resp. za okraj plochy, sa ignoruje (Harry stojí na mieste)

  • šípka na políčko s preskakovadlom (jedno z '1''9') spôsobí automatický presun na ďalšie políčko daným smerom, ak je týmto smerom opäť políčko s preskakovadlom, znovu sa to opakuje; ak je týmto smerom stena alebo okraj plochy, hráč zastane na tomto políčku s číslom

Riešenie zapíšte do triedy Program s týmito metódami:

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

    def __str__(self):
        ...

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

    def rob(self, postupnost):
        ...

kde

  • metóda __str__(): vráti znakový reťazec, ktorý reprezentuje momentálny stav plochy aj s pozíciou hráča (znak 'h'); medzi riadkami je znak '\n'

  • metóda start(riadok,stlpec): nastaví štartovú pozíciu Harryho - toto políčko je určite voľné

  • metóda rob(postupnost): kde parameter postupnost je znakový reťazec s postupnosťou príkazov, teda stláčaných šípok (znaky 'l', 'p', 'h', 'd') – hráč sa v ploche pohybuje podľa týchto zadaných príkazov; ak sa daným smerom nemôže pohnúť (okraj plochy, stena), tento konkrétny príkaz sa ignoruje, ak príde na políčko s preskakovadlom, tak, ak sa dá, zrealizuje tento presun, inak pokračuje ďalším príkazom; metóda vracia počet zdvihnutých predmetov; každé volanie tejto metódy vráti len ten počet predmetov, ktoré sa pozbierali počas tohto volania

Napr. pre súbor

xxxxxxxxxx
x.......ox
x.xxxxxxxx
xox.2....x
xxx..xxx.x
xo..xxo..x
xxxxxxxxxx

takýto test:

if __name__ == '__main__':
    p = Program('subor2.txt')
    p.start(3,5)
    print(p)
    print(p.rob('ldhpppp'))
    print(p.rob('llllllldd'))
    print(p)
    p.start(3,5)
    print(p.rob('llddllpphhpppddll'))
    print(p)

vypíše:

xxxxxxxxxx
x.......ox
x.xxxxxxxx
xox.2h...x
xxx..xxx.x
xo..xxo..x
xxxxxxxxxx
1
1
xxxxxxxxxx
x........x
x.xxxxxxxx
xhx.2....x
xxx..xxx.x
xo..xxo..x
xxxxxxxxxx
2
xxxxxxxxxx
x........x
x.xxxxxxxx
x.x.2....x
xxx..xxx.x
x...xxh..x
xxxxxxxxxx

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 ďalej pokračuje od 12:00 vyhodnotením v kancelárii m162.