Autorské riešenie
Riešenie tejto úlohy nie je náročné. Musíme si ho však vopred premyslieť. Pre skladanie veží zo štvorčekov platia isté pravidlá:
Pozrime sa najskôr na prvú podmienku. Dôsledkom tejto podmienky je, že ak chceme postaviť najvyššiu vežu, tak začneme najväčším štvorčekom. Postupne do veže pridávame menšie a na úplný vrchol položíme najmenší štvorček. Bolo by teda celkom fajn, keby sme zoznam štvorčekov usporiadali od najväčšieho po najmenší. V Pythone využijeme funkciu zoznamu sort() a v Imagine operácie utrieď a prevráť. Keďže na štvorček môžeme položiť len od neho menší, z každej veľkosti štvorčekov môžeme použiť najviac jednu. Potrebovali by sme teda zoznam štvorčekov bez duplicít. Ak už budeme mať zoznam usporiadaný, môžeme z neho vytvoriť nový, do ktorého vložíme každú veľkosť strany len raz. Druhá podmienka vyžaduje, aby boli štvorčeky vzájomne vycentrované. Dosiahnuť to môžeme viacerými spôsobmi. Napr. tak, že štvorčeky budeme kresliť zo stredu spodnej strany. Po vykreslení štvorčeka sa presunieme do stredu jeho hornej strany, lebo tu sa začne kresliť štvorček nad ním. Keďže na začiatku nevieme, koľko štvorčekov na kreslenie veže máme k dispozícii, veľkosti štvorčekov si uložíme do zoznamu. Výsledný kód môže vyzerať nasledovne: #Python import turtle def kresliStvorec(strana): for i in range(4): pero.forward(strana / 2) pero.left(90) pero.forward(strana / 2) def vymaz_duplicity(strany_stvorcov): strany_stvorcov_bez_duplicit = [] pridana_strana = '' for strana in strany_stvorcov: if strana != pridana_strana: strany_stvorcov_bez_duplicit.append(strana) pridana_strana = strana return strany_stvorcov_bez_duplicit def vytvor_vezu(strany_stvorcov): strany_stvorcov.sort(reverse=True) strany_stvorcov_bez_duplicit = vymaz_duplicity(strany_stvorcov) for strana in strany_stvorcov_bez_duplicit: pero.right(90) pero.pendown() kresliStvorec(strana) pero.penup() pero.left(90) pero.forward(strana) pero.backward(sum(strany_stvorcov_bez_duplicit)) pero = turtle.Turtle() tabula = turtle.Screen() strany_stvorcov = [30, 30, 40, 40, 60, 50] pero.left(90) vytvor_vezu(strany_stvorcov) tabula.mainloop() ;Imagine Logo
viem kresli_stvorec :strana
opakuj 4 [
do :strana / 2
vl 90
do :strana / 2
]
koniec
viem vymaz_duplicity :strany_stvorcov
urobTu "strany_stvorcov_bez_duplicit []
urobTu "pridana_strana "
prePrvky "strana :strany_stvorcov[
ak :strana <> :pridana_strana[
urobTu "strany_stvorcov_bez_duplicit vlozPo :strana :strany_stvorcov_bez_duplicit
urobTu "pridana_strana :strana
]
]
vy :strany_stvorcov_bez_duplicit
koniec
viem vytvor_vezu :strany_stvorcov
urobTu "strany_stvorcov utried :strany_stvorcov
urobTu "strany_stvorcov prevrat :strany_stvorcov
urobTu "strany_stvorcov_bez_duplicit vymaz_duplicity :strany_stvorcov
urobTu "vzdialenost 0
prePrvky "strana :strany_stvorcov_bez_duplicit[
vp 90
pd
kresli_stvorec :strana
ph
vl 90
do :strana
urobTu "vzdialenost :vzdialenost + :strana
]
vz :vzdialenost
koniec
Vaše zaujímavé riešenia a najčastejšie chyby Túto úlohu riešili dohromady 4 tímy. Jeden tím dosiahol plný počet. Veríme že sa Vám táto úloha páčila a bola pre Vás výzvou. |
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Slovensko, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |