Autorské riešenie
[stiahni imp : py]                                       

  • Počet riešiteľov: 26 / 34 = 76 %                       

  • Úspešnosť riešenia: 2.82 / 5 = 56.4%                   

Riešenie tejto úlohy je založené na vyriešení menších úloh. Je potrebné vyhodnotiť každú podmienku. Vhodnými parametrami procedúry/funkcie sú postupnosť obrázkov(obrazky) a finančné možnosti korytnačky(vreckove).

Tri podmienky sú v zadaní uvedené priamo:

  • nesmú ísť za sebou rovnaké obrázky,

  • každý z obrázkov sa v nej musí nachádzať aspoň raz,

  • cena za vykreslenie musí byť taká, aby si to korytnačka mohla dovoliť,

a jedna podmienka vyplýva zo zadania:

  • v postupnosti obrázkov sa môžu vyskytovať len tri rôzne druhy útvarov.

Overujme tieto podmienky postupne. Výsledná verzia procedúry/funkcie môže vyzerať nasledovne: 

;Imagine logo
viem over_postupnost :obrazky :vreckove

  urobTu "trojuholnikov (pocet :obrazky) - (pocet bezVyskytov "trojuholnik :obrazky)
  urobTu "kruhov (pocet :obrazky) - (pocet bezVyskytov "kruh :obrazky)
  urobTu "stvorcov (pocet :obrazky) - (pocet bezVyskytov "stvorec :obrazky)

  ak :trojuholnikov + :kruhov + :stvorcov <> pocet :obrazky [
    vysledok "nie
  ]

  ak (alebo :stvorcov = 0 :trojuholnikov = 0 :kruhov = 0)[
    vysledok "nie
  ]

  opakuj (pocet :obrazky) - 1 [
    ak prvok pocitadlo :obrazky = prvok pocitadlo + 1 :obrazky [
      výsledok "nie
    ]
  ]

  ak :trojuholnikov * 5 + :kruhov * 8 + :stvorcov * 3 > :vreckove [
    výsledok "nie
  ]

  výsledok "ano

koniec
#Python
def over_postupnost(obrazky, vreckove):
    # zistenie poctov jednotlivych obrazkov
    trojuholnikov = obrazky.count("trojuholnik")
    kruhov = obrazky.count("kruh")
    stvorcov = obrazky.count("stvorec")

    #kontrola, ci vstup je korektny - zoznam obsahuje len povolene obrazky,
    if trojuholnikov + kruhov + stvorcov  != len(obrazky):
        return False

    # zistenie, ci sa kazdy obrazok nachadza v postupnosti aspon raz
    if stvorcov == 0 or trojuholnikov == 0 or kruhov == 0:
        return False

    # zistenie, ci sa v postupnosti nachadaju 2 obrazky za sebou
    for i in range(len(obrazky) - 1):
        if obrazky[i] == obrazky[i + 1]:
            return False

    # zistenie, ci cena nakreslenia obrazkov nie je vacsia ako vreckove
    if trojuholnikov * 5 + kruhov * 8 + stvorcov * 3 > vreckove:
        return False

    return True

Na začiatku si spočítame počty jednotlivých obrázkov.

Ak sa súčet počtov trojuholníkov, kruhov a štvorcov nerovná počtu prvkov postupnosti tak vieme, že v postupností sa nachádza aj nejaký iný obrázok. V tomto prípade postupnosť pravidlám nevyhovuje a nemá zmysel testovať ďalšie podmienky.

Ak sa počet výskytov nejakého obrázka rovná 0, obrázok sa v postupnosti nenachádza. Postupnosť podmienkam nevyhovuje a nemá zmysel pokračovať ďalej..

Skontrolujeme, či sa v postupnosti nenachádzajú 2 rovnaké obrázky za sebou. Ak áno, postupnosť nevyhovuje podmienkam.

Nakoniec spočítame výslednú cenu za vykreslenie zadanej postupnosti obrázkov a porovnáme ju s vreckovým korytnačky. Ak je cena vyššia ako vreckové, tak postupnosť nevyhovuje.

Ak postupnosť prešla všektými predchádzajúcimi testami, požiadavkám vyhovuje.

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

Zo zadania priamo nevyplýva, či chceme mať na každý deň jeden obrázok (a počet obrázkov by mal byť 7) alebo či si korytnačka nechá vytlačiť všetky obrázky naraz pre celý týždeň. Len jeden tím kontroloval počet obrázkov. Akceptovali sme obidva prístupy.

Najčastejšou chybou bolo to, že výsledok procedúry/funkcie nebol vrátený, ale vypísaný.

Ďalšou častou chybou bolo to, že vstupné dáta boli získavané vo vnútri procedúry/funkcie príkazom čítajSlovo/input alebo použitím globálnych premenných. Keďže problém vypisovania hlášok dominoval, nižšie môžeme vidieť výber hlášok, ktoré boli použité v riešeniach. Namiesto vypisovania týchto hlášok bolo potrebné vrátiť výsledok: true/false v riešeniach v jazyku Python a áno/nie v jazyku Imagine logo.

Vybrané výpisy hlásiace neakceptovanie postupnosti:

  • Nemôžeš si to dovoliť, je mi to ľúto.
  • Málo peňazí
  • Nemôžeme vyhovieť vašej požiadavke.
  • Nejaky (alebo nejake) z obrazkov sa v postupnosti nenachadza.
  • Zadanú postupnosť si nemôžete dovoliť.
  • nemôžem vyhovieť tvojmu želaniu, lebo nedodržiavaš 1. podmienku
  • ...

Výpisy hlásiace akceptovanie postupnosti:

  • Dá sa zafarbiť.
  • Tetovanie možné
  • Korytnacka si kupu moze dovolit. Hura!
  • Objednávka bola odoslaná. Ďakujeme vám!
  • Vaša objednávka bola zaregistrovaná. Všetko sedí.
  • Toto si môžeš dovoliť a pancieropainter ti to z radosťou splní.
  • Tvoja objednávka vyhovuje podminkam. Čo chvíľa si budeš môcť užívať neobyčajnú zimu.
  • ...