|
Autorské riešenie
[stiahni py]
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:
-
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.
-
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.
-
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.
-
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.
|