Autorské riešenie
[stiahni [imp py]]

  • Počet riešiteľov:  16 / 26 = 62 %

  • Úspešnosť riešenia:  2.25 / 5 = 45 %

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:

  • použitie dekompozície a hľadanie vzoru ako stratégií riešenia problémov

  • precvičenie

    • práce s reťazcami,

    • príkazov opakovania a vetvenia,

    • funkcii s parametrami a výstupmi.

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:

  • Nezohľadnenie rôznej dlžky učiteľovho a žiakovho textu.
  • Vypísanie hodnoty namiesto vrátenia hodnoty. Vo všeobecnosti odporúčame, aby ste v riešeniach súťažných úloh výsledky nevypisovali, ale vracali (použitím kľúčového slova return v Pythone alebo výsledok v Imagine Logu). Napríklad pri krátení zlomku zadaného v zozname [8, 12] na zlomok [2, 3] musíme použiť funkciu, ktorá nám vráti najvúčší spoločný deliteľ, nie ktorá ho len vypíše.
  • V piatich riešeniach sme zaregistrovali jednopísmenové premenné. Namiesto nich odporúčame použiť zmysluplné názvy premenných, ktoré zlepšujú čitateľnosť programu a prípadne hľadanie a opravenie chyby.
  • Neporiadne odsadený programový kód, ktorý zhoršuje čitateľnosť programu a tým komplikuje autorovi programu nájsť prípadnú chybu v programe..