Autorské riešenie
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:
a jedna podmienka vyplýva zo zadania:
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. Ď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:
Výpisy hlásiace akceptovanie postupnosti:
|
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |