Autorské riešenie
[stiahni py]                                       

  • Počet riešiteľov: 9 / 13 = 69 %                       

  • Úspešnosť riešenia:  5.11 / 6 = 85 %                   

Na vyriešenie tejto úlohy je potrebné použiť porovnávanie dvoch rovnako dlhých reťazcov. Prechádzame teda postupne všetky pozície vo vzorovom a prepísanom reťazci. Ak narazíme na miesto, v ktorom sa tieto reťazce nezhodujú, mohlo dôjsť ku chybe dvoch typov.

Chyba prvého typu znamená, že súčasný znak v prepísanom reťazci a nasledujúci znak v prepísanom reťaci sú len vymenené v porovnaní so vzorovým reťazcom. Túto situáciu vieme vyriešiť tak, že overíme, či súčasný znak prepísaného reťazca sa rovná nasledujúcemu znaku vzorového reťazca, a zároveň nasledujúci reťazec prepísaného reťazca sa rovná súčasného znaku vzorového reťazca. V takomto prípade pripočítame k aktuálnemu počtu trestných bodov 1 bod a preskočíme pozíciu nasledujúceho znaku v prepísanom reťazci.

Chyba druhého typu znamená, že nenastala chyba prvého typu, a zároveň súčasný znak v prepísanom reťazci a súčasný znak vo vzorovom reťazci sú rôzne. V takomto prípade pripočítame k aktuálnemu počtu trestných bodov 2 body a posunieme sa na nasledujúci znak.

Ostáva nám už len zabezpečiť situáciu, aby sa správne vyhodnotil aj posledný znak reťazca, v takom prípade test chyby prvého typu nevyhodnocujeme.

Nasleduje možný zdrojový kód v jazyku Python:

#Python
def pocet_bodov(vzor, prepis):
    trestne_body = 0
    pozicia = 0
    while pozicia < len(vzor):
        if vzor[pozicia] != prepis[pozicia]:
            if (pozicia + 1 < len(vzor) and
                    vzor[pozicia] == prepis[pozicia + 1] and
                    vzor[pozicia + 1] == prepis[pozicia]):
                trestne_body += 1
                pozicia += 2
            else:
                trestne_body += 2
                pozicia += 1
        else:
            pozicia += 1
    return trestne_body

Vaše zaujímavé riešenia a najčastejšie chyby

Úlohu riešilo 9 tímov. Niektoré z tímov navyše ošetrili aj podmienku, ktorú sme predpokladali, že vzorový a prepísaný reťazec majú rovnakú dĺžku. Tiež chválime prácu viacerých tímov, ktoré zdrojový kód okomentovali, vhodne otestovali a použili správny zápis podmienok vo vetvení if. Niektoré tímy nedokázali túto podmienku správne zapísať, alebo program vypísal počet trestných bodov iba za jednu chybu a nespočítal, ak bolo v reťazci chýb viac.