Autorské riešenie
[stiahni imp py]

  • Počet riešiteľov: 21 / 26 = 81%

  • Úspešnosť riešenia:  5,3 / 6 = 88%

Riešenie tejto úlohy môžeme rozdeliť do troch častí. V prvej časti nájdeme najmenšiu hodnotu čítania kníh v zozname. Do nového zoznamu si uložíme všetky indexy kníh, ktoré majú tento najmenší počet prečítaní. V druhej časti zo zoznamu indexov kníh, ktoré majú najmenší počet prečítaní, vyberieme náhodne jeden prvok. Nakoniec, pre tento náhodne zvolený prvok, teda náhodne zvolenú knihu, zo zoznamu najmenej prečítaných kníh, zvýšime počet čítaní tejto knihy o jedna.

Je potrebné si tiež uvedomiť, že na vstupe by mali byť len zoznamy, ktorých hodnoty sa líšia najviac o jedna, napr. [3 3 3 4 3 4 3 3 4]. Je totiž zrejmé, že ak použijeme pravidlo zo zadania, tak zabezpečíme, aby čítania týchto kníh prebiehali rovnomerne. Ak sme knihe s najmenším počtom čítaní zvýšili hodnotu o jedna, môže byť v ďalšom kole vybraná iba v prípade, ak túto najmenšiu hodnotu čítaní v predchádzajúcej kole už nemala žiadna iná kniha.

Nasledujú moľné riešenia v jazyku Imagine a Python.

#imagine
viem vyber
  urobTu "najmenej_citani prvok 1 :pocty_citani

  prePrvky "pocet_citani :pocty_citani[
    ak :pocet_citani < :najmenej_citani [
      urobTu "najmenej_citani :pocet_citani
    ]
  ]

  urobTu "indexy_najmenej_citanych []
  opakuj pocet :pocty_citani [
    ak prvok pocitadlo :pocty_citani = :najmenej_citani [
      urobTu "indexy_najmenej_citanych vlozPo pocitadlo :indexy_najmenej_citanych
    ]
  ]

  urobTu "rozpravka_na_citanie ?prvok :indexy_najmenej_citanych
  urobTu "pocet_citani prvok :rozpravka_na_citanie :pocty_citani
  urob "pocty_citani nahraď :rozpravka_na_citanie :pocty_citani :pocet_citani + 1

  vy :rozpravka_na_citanie

koniec

#python
import random
def vyber(pocty_citani):
    najmenej_citani = min(pocty_citani)
    indexy_najmenej_citanych = []
    for i in range(len(pocty_citani)):
        if pocty_citani[i] == najmenej_citani:
            indexy_najmenej_citanych.append(i)
    rozpravka_na_citanie = random.choice(indexy_najmenej_citanych)
    pocty_citani[rozpravka_na_citanie] += 1
    return rozpravka_na_citanie
 

Všimnime si rozdiel medzi riešením v Imagine logu a v Pythone. V Imagine logu sme využili globálnu premennú :pocty_citani. V Pythone sme počty čítaní poslali v parametri pri volaní funkcie.

Zatiaľ čo v Imagine logu musíme najmenší prvok v zozname počtu čítaní nájsť, v Pythone na to použijeme funkciu.

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

Úlohu riešilo 21 tímov. Väčšina tímov použila programovací jazyk Python so správnym riešením. Ak najmenej prečítanými bolo viac rozprávok, súťažiaci na prečítanie vybrali rozprávku náhodne, resp. prvý výskyt takejto rozprávky. V niektorých riešeniach chýbala záverečná časť - zvýšenie počtu prečítaní vybranej rozprávky. Niektorí súťažiaci správne pracovali so zoznamom, ale nepoužili ho ako vstupný parameter, alebo pre vstup nedával program správny výsledok.