Zadanie skúšky 23.1.2015
Písmenkový robot
Na štvorčekovej ploche sa pohybuje robot, ktorý je riadený postupnosťou povelov:

povel je dvojica: (číslo,smer), kde smer je jedno z 's', 'v', 'j', 'z' (pre sever, východ, juh, západ)
a číslo označuje, koľkokrát sa robot pohne daným smerom
Pri štarte sa na niektorých políčkach v ploche nachádzajú písmenká. Okrem toho na obvode plochy (t.j. prvý
aj posledný riadok, prvý aj posledný stĺpec) sú prekážky. Ak počas vykonávania povelu robot nabúra do prekážky, tento povel už ignoruje a poslúcha až ďalšie povely.
Ak robot počas chodenia prejde cez políčko s písmenkom, zdvihne ho (zapamätá si ho) a na jeho miesto položí prekážku: na budúce cez toto políčko už neprejde.
Vstupný súbor obsahuje popis plochy:


v prvom riadku súboru sú dve čísla: počet riadkov a počet stĺpcov (veľkosť plochy aj s rámikom)
ďalšie riadky popisujú pozície písmenok, v každom riadku sú tri hodnoty:
písmeno riadok stĺpec
Zadefinujte triedu Program:
class Program:
def __init__(self, meno_suboru):
...
def __repr__(self):
...
def robot(self, riadok, stlpec):
...
def povely(self, postupnost):
...
kde




metóda __init__(self, meno_suboru) : prečíta súbor a vytvorí dvojrozmerné pole s rozložením
písmenok a prekážok
metóda __repr__(self): vráti znakový reťazec, ktorý reprezentuje momentálny stav plochy aj s
prekážkami (znak '*'); robot sa tu nezobrazuje a medzi riadkami je znak '\n'
metoda robot(self, riadok, stlpec): umiestni robota na zadanú pozíciu, môžete predpokladať,
že je voľná a nie je na nej prekážka ani písmenko
metóda povely(self, postupnost): vykoná zadanú postupnosť povelov (v tejto postupnosti sú
povely dvojicami (počet,smer)); robot vykoná zadané povely a metóda vráti znakový reťazec s pozbieranými znakmi; každé volanie tejto metódy vráti len tie znaky, ktoré sa pozbierali počas tohto volania
Každé ďalšie volanie metód robot() aj povely() pokračuje na ploche, v ktorej sa chodilo predtým a už sa tu
zbierali písmenká.
Napr. pre plochu
*****
* A *
*J H*
* O *
*****
tento test:
if __name__ == '__main__':
p = Program('subor.txt')
print(p)
p.robot(2,2)
s = p.povel([(1,'s'),(1,'v'),(2,'j'),(2,'z'),(2,'s')])
print('zozbieral:', s)
print(p)
vypíše:
*****
* A *
*J H*
* O *
*****
zozbieral: AHOJ
*****
* * *
** **
* * *
*****
V druhom teste si všimnite, že metódu povely() voláme dvakrát za sebou. Plocha:
******
* JF *
* OM *
* HF *
* AI *
******
test:
if __name__ == '__main__':
p = Program('subor1.txt')
p.robot(4,1)
print('prvy:', p.povely([(1,'v'),(3,'s')]))
print('druhy:', p.povely([(1,'v'),(3,'j')]))
vypíše:
prvy: AHOJ
druhy: FMFI
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 http://capek.ii.fmph.uniba.sk/list.
Skúška pokračuje od 12:00 vyhodnotením v kancelárii m162.
Download

Zadanie skúšky 23.1.2015