Autorské riešenie
Najprv skúsme vyriešiť zjednodušenú úlohu, v ktorej uvažujeme o rovnakej dĺžke učiteľovho aj žiakovho textu. Hlavnou stratégiou riešenia úlohy je postupne prechádzať znak po znaku v učiteľovom a žiakovom texte a z nich vytvárať nový text. V tomto novom texte sa v prípade odlišného znaku v učiteľovom a žiakovom texte na danom mieste uloží znak ~ (tilda), inak sa tam uloží znak z učiteľovho textu (resp.žiakovho textu, lebo sú zhodné). Ak si nový text označíme premennou "oprava, procedúra v jazyku Imagine Logo s 2 parametrami porovnávajúca učiteľov a žiakov text môže vyzerať nasledovne: ;Imagine Logo viem vyhodnot_diktat :ucitel :ziak urobTu "oprava " opakuj počet :ucitel [ ak2 prvok počítadlo :ucitel <> prvok počítadlo :ziak [ urobTu "oprava slovo :oprava "~ ][ urobTu "oprava slovo :oprava prvok počítadlo :ucitel ] ] výsledok :oprava koniec Riešenie tejto zjednodušenej úlohy zapísané v jazyku Python môže vyzerať nasledovne: #Python def vyhodnot_diktat(ucitel, ziak): oprava = '' for i in range(len(ucitel)): if ucitel[i] != ziak[i]: oprava = oprava + '~' else: oprava = oprava + ucitel[i] return oprava Pri riešení úlohy však môže nastať situácia, že dlžka učiteľovho a žiakovho textu bude rôzna. Vtedy riešenie zjednodušenej úlohy doplníme na začiatku o zistenie dĺžky kratšieho z týchto dvoch textov (ktorú uložíme do premennej "dlzka_min) a zistenie rozdielu dĺžok dlhšieho a kratšieho textu (ktorú uložíme do premennej "dlzka_zvysku). Na konci do nového reťazca doplníme toľko znakov ~, koľko je rozdiel dĺžok dlhšieho a kratšieho textu. Výsledné riešenie celej úlohy zapísané v jazyku Python môže vyzerať nasledovne: #Python def vyhodnot_diktat(ucitel, ziak): oprava = '' dlzka_min = min(len(ucitel), len(ziak)) dlzka_zvysku = max(len(ucitel), len(ziak)) - dlzka_min for i in range(dlzka_min): if ucitel[i] != ziak[i]: oprava = oprava + '~' else: oprava = oprava + ucitel[i] oprava = oprava + dlzka_zvysku * '~' return oprava Riešenie úlohy uvedené v jazyku Imagine Logo môže vyzerať nasledovne: ;Imagine Logo viem vyhodnot_diktat :ucitel :ziak urobTu "oprava " ak2 počet :ucitel >= počet :ziak [ urobTu "dlzka_min počet :ziak urobTu "dlzka_zvysku (počet :ucitel) - :dlzka_min ][ urobTu "dlzka_min počet :ucitel urobTu "dlzka_zvysku (počet :ziak) - :dlzka_min ] opakuj :dlzka_min [ ak2 prvok počítadlo :ucitel <> prvok počítadlo :ziak [ urobTu "oprava slovo :oprava "~ ][ urobTu "oprava slovo :oprava prvok počítadlo :ucitel ] ] opakuj :dlzka_zvysku [ urobTu "oprava slovo :oprava "~ ] výsledok :oprava koniec Uvedené riešenie v jazyku Imagine Logo je menej elegantné ako v jazyku Python, lebo v Pythone vieme použiť funkcie min() a max() a tiež textový operátor * na viacnásobné opakovanie uvedeného znaku. Táto súťažná úloha je zameraná na:
Vaše zaujímavé riešenia a najčastejšie chyby Do riešenia tejto úlohy sa zapojilo 11 tímov kategórie PROFÍK a 5 tímov kategórie EXPERT. Celkovo 12 tímov riešilo úlohu v jazyku Imagine Logo a 4 tímy v jazyku Python. Plný počet bodov bohužiaľ nezískal žiaden tím. Najúspešnejšími tímami boli Bojovnik Macek, BonifacGroup a File_Open, ktorí stratili pol bodu za to, že výsledok nevrátili, ale ho len vypísali. Pochvalu so zaslúži tím Pcmasters, ktorý ako jediný odovzal riešenie, v ktorom výsledky nevypísal, ale vrátil, čo bolo požadované v zadaní úlohy, a tiež tím Tím Bojovník Macek, ktorý ako jediný vo svojom riešení zachytil výnimku. V riešeniach sme zaregistrovali nasledovné chyby:
|
|||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |