Autorské riešenie
[stiahni profil.py]

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

  • Úspešnosť riešenia: 6,67 / 9 = 74 %

Ak sa pozrieme na zoznam predstavujúci celý obsah priečinka zistíme, že je to:

  • dátová štruktúra typu zoznam (list),

  • nepravidelná dátová štruktúra,

  • viacrozmerná dátová štruktúra, ktorá obsahuje niekoľko úrovní vnorených zoznamov. 

Napriek tomu, isté vzory v tejto štruktúre nachádzame:

  • prvý prvok každého zoznamu je reťazec a predstavuje názov priečinka,

  • pre ostatné prvky zoznamu platí:

    • ak je to reťazec, tak predstavuje názov súboru,

      • typ súboru určuje reťazec za poslednou bodkou v jeho názve,

      • ak názov súboru neobsahuje bodku, je to neznámy typ súboru,

    • ak je to zoznam, tak predstavuje podpriečinok s rovnakou štruktúrou,  je to teda rekurzívna dátová štruktúra.

Prechádzať prvkami takéhoto zoznamu a vyhodnocovať ich význam dokážeme pomocou cyklu. Na túto úlohu si vieme vytvoriť šikovnú funkciu: pocty_typov. Problém nastane, ak prvkom je zoznam. Z predchádzajúceho textu vieme, že aj on má rovnakú štruktúru ako zoznam, ktorým práve prechádzame. Na analýzu tohto podzoznamu teda môžeme opäť využiť funkciu pocty_typov. Ostáva ešte zabezpečiť, aby sme výsledky z jednotlivých zoznamov (podpriečinkov) postupne akumulovali. Na toto môžeme využiť napr. slovník.

Výsledné riešenie môže vyzerať nasledovne:

def pocty_typov(zoznam, pocty = None):
    if pocty is None:
        pocty = {}
    for polozka in zoznam[1:]:
        if isinstance(polozka, str):
            idx_bodka = polozka.rfind('.')
            if idx_bodka == -1:
                typ = 'neznamy'
            else:
                typ = polozka[idx_bodka + 1:].lower()
            pocty[typ] = pocty.get(typ, 0) + 1
        else:
            pocty_typov(polozka, pocty)
    return pocty 

Všimnime si niekoľko detailov:

  • k parametrom sme pridali aj parameter pocty, pri prvom volaní funkcie pocty_typov ho nezadáme a vo funkcii vytvoríme  prázdny slovník, analýza prvého zoznamu (predstavuje hlavný pracovný priečinok) začína s prázdnym slovníkom,

  • pri analýze zoznamu:

    •  vynecháme prvý prvok, pretože predstavuje názov priečinku,

    • ak je prvkom reťazec, zistíme pozíciu poslednej bodky v jeho názve a následne jeho príponu, aktualizujeme počet súborov tohto typu v slovníku, ak súbor nemá príponu (jeho názov neobsahuje bodku), registrujeme ho ako neznámy typ,

    • ak je prvkom zoznam, zavoláme funkciu pocty_typov a okrem tohto prvku jej pošleme už z časti aktualizovaný slovník, keďže slovník je meniteľný dátový typ, všetky inštancie funkcie pocty_typov pracujú s jedným a tým istým slovníkom,

  • funkcia vracia slovník pocty_typov, ale túto návratovú hodnotu nikde nepoužívame, využijeme ju len v jednom prípade a to v hlavnom programe, kde funkciu voláme len s argumentom zoznam a čakáme, že nám funkcia vráti počty jednotlivých typov súborov.

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

Žiacke riešenia tejto úlohy môžeme rozdeliť do dvoch skupín.

Menšia časť z vás sa snažila rekurzívnou štruktúrou prechádza pomocou cyklov alebo túto štruktúru skonvertovať do jedného reťazca a podľa zátvoriek "[" identifikovať jednotlivé časti zoznamov. V princípe je to možné, aj keď omnoho prácnejšie.

Väčšia časť z vás na prechod rekurzívnou štruktúrou použila rekurzívnu funkciu. Tieto riešenia sa líšili v implementačných detailoch (pomocná funkcia, pomocná dátová štruktúra ...) ale v princípe implementovali správnu myšlienku. Za zmienku stojí riešeniu tímu nayR guru, ktorý rekurziu simuloval radom. Benefitom tohto riešenia je, že nemá nevýhody rekurzie (pamäťová náročnosť, obmedzená úroveň vnorenia rekurzie v Python-e).