Autorské riešenie
[stiahni py]

  • Počet riešiteľov: 4 / 6 = 67 %

  • Úspešnosť riešenia: 3 / 5 = 60%

Začnime riešiť túto úlohu v jednoduchšej verzii - predstavme si, že každý človek, ktorý už ovláda základy programovania bude ihneď po dokončení svojej výučby učiť jedného iného človeka. V takomto prípade na úspešné vyriešenie potrebujeme vedieť počet ľudí v meste (parameter) a správne nastaviť počiatočné hodnoty (jedna programátorka Noemi, zatiaľ prešlo 0 mesiacov).

Náš program by v takomto prípade mohol vyzerať napríklad takto:

def simulacia_vyucby(pocet_obyvatelov):
  pocet_programatorov = 1
  pocet_mesiacov = 0

  while pocet_programatorov < pocet_obyvatelov:
    pocet_programatorov = pocet_programatorov + pocet_programatorov
    pocet_mesiacov += 1

  return pocet_mesiacov 

Pozrime sa bližšie na jednotlivé časti kódu:

  • nastavenie počiatočných hodnôt podľa zadania
  • spustenie while cyklu na základe počtu programátorov voči počtu všetkých obyvateľov
    • tento postup nám umožňuje následne pracovať iba s počtom už naučených, nie aj tých, ktorých naučiť ešte treba
  • každý mesiac pripočítame k existujúcemu počtu programátorov počet osôb, ktoré sme stihli za ten mesiac naučiť základy programovania
    • keďže každý programátor učil jednu osobu, tento počet je rovný počtu programátorov
  • pripočítame mesiac

Každý z programátorov má však rôzne povinnosti. Každý z nich si teda v daný mesiac vyberá, či vezme jedného, dvoch alebo troch nových "žiakov". Upravme náš kód tak, aby zodpovedal tejto skutočnosti.

from random import randint

def simulacia_vyucby(pocet_obyvatelov):
  pocet_programatorov = 1
  pocet_mesiacov = 0

  while pocet_programatorov < pocet_obyvatelov:
    novi_za_mesiac = 0

    for i in range(pocet_programatorov):
      novi_za_mesiac += randint(1, 3)

    pocet_programatorov = pocet_programatorov + novi_za_mesiac
    pocet_mesiacov += 1

  return pocet_mesiacov

Keďže si každý z už naučených programátorov osobitne vyberá počet "žiakov", každý mesiac si budeme zaznamenávať koľko nových programátorov za daný mesiac pribudne. Každý mesiac toto číslo závisí od počtu už existujúcich programátorov, pričom každý z nich za mesiac naučí jedného, dvoch alebo troch nových. Následne tento počet nových programátorov pripočítame k už naučeným programátorom, zvýšime o jeden hodnotu premennej pocet_mesiacov a pokračujeme v simulácií. Samotné rozhodnutie, či si programátor vezme jedného, dvoch alebo troch sme v simulácií nechali na náhodu s rovnakou pravdepodobnosťou pre všetky možnosti.

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

  • pochopenie zadania tak, že "obyvatelia mesta" sú jeden celok, a teda celé mesto (ako celok) si vyberá, či bude v danom čase učiť jedného, dvoch alebo troch programátorov
  • proces rozhodovania medzi jedným, dvoma alebo troma ovplyvniteľný pri spustení simulácie, a to konkrétne umožnením ľubovoľného rozloženia pravdepodobností pre jednotlivé možnosti

Konkrétne chyby, ktoré riešenie tejto úlohy sprevádzali u viacerých:

  • použitie presnej hodnoty ako podmienky vo while cykle, t.j. pocet == 0 namiesto pocet > 0
    • čo je väčšinou neželané riešenie, keďže práve v tejto úlohe sa môže stať, že naučia v danom mesiaci alebo v danom bode viac, ako bolo presne treba - a teda program nikdy neskončí
  • použitie vetvenia namiesto použitia vzorca pri výpočte počtu nových programátorov
  • obmedzenie počtu možných nových programátorov počtom extistujúcich programátorov (t.j. Noemi mohla naučiť iba jedného nového, lebo je iba jedna)
  • ale taktiež aj nevhodné názvy premenných ("a", "p", "z") či použitie camelCase namiesto snake_case pre pomenovanie premenných.