Autorské riešenie
[stiahni py]

  • Počet riešiteľov: 33 / 35 = 94 %

  • Úspešnosť riešenia:  5,91 / 7 = 84,43 %

Riešenie tejto úlohy spočíva v správnom prechádzaní textového reťazca (správnom prečítaní znakových a číselných znakov). Správne prečítanie znakových reťazcov v tvare 'zs' alebo 'ss', je potrebné na to, aby sme vedeli, ktorej škole pripočítavame hodnotu. Správne prečítanie číselných reťazcov zabezpečí, aby bola škole priradená správna hodnota. Taktiež musíme prečítané hodnoty vedieť ukladať do premennej a spočítavať. Po prejdení celého reťazca, spočítaní a pridelení všetkých hodnôt, je potrebné ich vrátiť ako výstupnú hodnotu funkcie.

Vytvorenie funkcie a premenných
Prvým krokom pri riešení tejto úlohy je vytvorenie funkcie so vstupným parametrom, ktorý slúži na zadanie textového reťazca pri zavolaní funkcie. Ďalej si potrebujeme vytvoriť dve premenné, ktoré reprezentujú jednotlivé školy (zš, sš) a do ktorých si budeme ukladať hodnoty zozbieraných kg papiera. Ešte si vytvoríme premennú, ktorá bude reprezentovať index a pomôže pri prechádzaní reťazca.

def vyhodnot(zaznam):
    zs_kg = 0
    ss_kg = 0
    idx = 0

Čítanie reťazca - textové znaky
Začíname čítať reťazec - pomocou cyklu while. Ak čítame hodnotu na indexe, na ktorom sa nachádza znak 'z', uložíme do premennej typ hodnotu 'zs'. Ak sa na tomto indexe nachádza znak 's', uložíme do premennej typ hodnotu 'ss'. Nakoniec ešte zvýšime index o 2 - pretože aj pri 'zs' aj 'ss' vieme, že sa na pozícii index + 1, bude nachádzať znak 's' (skola), ktorý nepotrebujeme nijak využiť. Táto časť kódu slúži na určenie typu školy, ktorý sme práve prečítali a vieme tak, ku ktorej škole budeme pripočítavať hodnotu nazbieraných kg, nachádzajúcu sa na nasledujúcich indexoch.

    while idx < len(zaznam):
        if zaznam[idx] == 'z':
            typ = 'zs'
        elif zaznam[idx] == 's':
            typ = 'ss'
        idx = idx + 2

Čítanie reťazca - číselné znaky
Vytvoríme si premennú (typu string), do ktorej budeme ukladať prečítané číselné znaky. Aj v tomto prípade použijeme cyklus while, v ktorom si overujeme, či sa nachádzame na platnom indexe a, či hodnota na tomto indexe je číselná. Ak hodnota číselná nie je, vieme tak, že sme prečítali celú jednu číselnú hodnotu patriacu jednému typu školy.

         cislice = ''
        while idx < len(zaznam) and zaznam[idx].isdigit():
            cislice = cislice + zaznam[idx]
            idx = idx + 1
        cislo = int(cislice)

Priradenie hodnôt a vrátenie výsledku
Na záver priradíme prečítanú číselnú hodnotu prislúchajúcemu typu školy a vrátime prečítané a spočítané hodnoty nazbieraných kg papiera pre jednotlivé školy.

        if typ == 'zs':
            zs_kg += cislo
        else:
            ss_kg += cislo
    return zs_kg, ss_kg

Výsledná funkcia môže vyzerať nasledovne: 

def vyhodnot(zaznam):
    zs_kg = 0
    ss_kg = 0
    idx = 0
    while idx < len(zaznam):
        # identifikujeme typ skoly
        if zaznam[idx] == 'z':
            typ = 'zs'
        elif zaznam[idx] == 's':
            typ = 'ss'
        idx = idx + 2

        # precitame cislo za typom skoly
        cislice = ''
        while idx < len(zaznam) and zaznam[idx].isdigit():
            cislice = cislice + zaznam[idx]
            idx = idx + 1
        cislo = int(cislice)

        # podla typu skoly pripocitame cislo
        if typ == 'zs':
            zs_kg += cislo
        else:
            ss_kg += cislo
    return zs_kg, ss_kg

Alternatívne riešenie
Pre zaujímavosť ponúkame aj šikovnejšie, využívajúce regulárne výrazy. Regulárne výrazy sú silný nástroj určený pre rozpoznávanie textových vzorov v reťazcoch.

import re

def vyhodnot(zaznam):
    zs_cisla_str = re.findall(r'zs([0-9]*)', zaznam)
    zs_kg = sum(int(cislo) for cislo in zs_cisla_str)
    ss_cisla_str = re.findall(r'ss([0-9]*)', zaznam)
    ss_kg = sum(int(cislo) for cislo in ss_cisla_str)
    return zs_kg, ss_kg

Všimnime si, že prvý regulárny výraz hľadá všetky podreťazce, ktoré majú tvar: 'zs([0-9]*)'. Začínajú reťazcom 'zs', za ktorým nasleduje ľubovoľný počet číslic [0-9]*. Z týchto podreťazcov extrahuje len samotné číslice. Výsledkom je zoznam číselných reťazcov, ktoré stačí pretypovať na int a vzájomne sčítať. Analogicky postupujeme aj pri záznamoch pre stredné školy.

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

Väčšina riešiteľov postupovala podobne ako v autorskom riešení. Najčastejšími chybami bolo nezapočítanie poslednej hodnoty v reťazci alebo počítanie hodnôt spolu a nie oddelene pre základnú a strednú školu.