Autorské riešenie
[stiahni py]

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

  • Úspešnosť riešenia: 5,5 / 9 = 61 %

O každom používateľovi máme jeden záznam v tvare ["meno", pocet_prispevkov, zoznam_komentujucich]. Dôležité je správne pochopiť význam tretej položky. Zoznam zoznam_komentujucich nehovorí, koho daný používateľ komentoval, ale naopak, kto komentoval jeho príspevky.

Rating používateľa počítame podľa vzorca 2 * pocet_prispevkov + pocet_komentarov, pričom počet komentárov znamená počet komentárov, ktoré používateľ napísal k príspevkom ostatných používateľov. Preto nestačí pozrieť iba záznam hľadaného používateľa. Je potrebné prejsť celú sociálnu sieť.

Jedna z možných myšlienok riešenia je nasledujúca:

  1. Nájdenie počtu príspevkov: Pri prechode všetkých záznamov nájdeme záznam používateľa, ktorého meno je rovné parametru meno. Z neho si zapamätáme počet jeho príspevkov.

  2. Spočítanie komentárov: V záznamoch ostatných používateľov spočítame, koľkokrát sa hľadané meno nachádza v zozname komentujúcich. Funkcia count() je vhodná, pretože správne započíta aj viacnásobné komentáre toho istého používateľa.

  3. Vynechanie vlastných príspevkov: Ak práve spracúvame záznam hľadaného používateľa, jeho zoznam komentujúcich do počtu jeho komentárov nezarátame. Rating totiž zohľadňuje komentáre, ktoré napísal k príspevkom iných používateľov.

  4. Výpočet ratingu: Po prejdení všetkých záznamov už poznáme obe potrebné hodnoty a vrátime 2 * pocet_prispevkov + pocet_komentarov.

Algoritmus prejde každý záznam práve raz.

Nasleduje možné autorské riešenie v jazyku Python:

def rating(data, meno):
    pocet_prispevkov = 0
    pocet_komentarov = 0

    for zaznam in data:
        autor = zaznam[0]
        prispevky = zaznam[1]
        komentujuci = zaznam[2]

        if autor == meno:
            pocet_prispevkov = prispevky
        else:
            pocet_komentarov += komentujuci.count(meno)

    return 2 * pocet_prispevkov + pocet_komentarov

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

Viacerí riešitelia našli veľmi stručné a správne riešenie založené na prechode všetkých záznamov a použití metódy count(). Pekným riešením bolo aj explicitné preskočenie záznamu hľadaného používateľa pomocou continue. Takýto postup prirodzene zabezpečí, že sa nezapočítajú prípadné komentáre pod vlastnými príspevkami.

Najčastejšou vecnou chybou bolo nesprávne pochopenie tretej položky záznamu. Použitie len(zaznam[2]) pri zázname hľadaného používateľa počíta počet komentárov, ktoré dostal, nie počet komentárov, ktoré sám napísal. Na získanie správneho počtu treba hľadať jeho meno v zoznamoch komentujúcich pri ostatných používateľoch.

Ďalšou častou chybou bolo započítanie komentárov pod vlastnými príspevkami. Niektoré riešenia správne prešli všetky záznamy a použili count(), ale nerozlíšili, komu daný záznam patrí. Takéto riešenie je veľmi blízko správnemu, no môže vrátiť príliš vysoký rating.

Objavil sa aj predčasný return odsadený vo vnútri cyklu for. Funkcia potom skončí po prvom zázname a nemôže spočítať komentáre naprieč celou sieťou. V iných riešeniach boli údaje alebo výsledky zapísané priamo do programu namiesto použitia parametrov funkcie, takže fungovali iba pre konkrétny príklad a nie všeobecne.

Pri porovnávaní hodnôt si treba dať pozor aj na dátové typy. Celý záznam používateľa je zoznam, zatiaľ čo meno komentujúceho je reťazec. Porovnanie týchto dvoch rôznych objektov preto nemôže slúžiť na zistenie, či daný používateľ komentoval príspevok.