Autorské riešenie
Úlohou je nakresliť pohľad zhora na kruhovú viac-poschodovú tortu. Teda z pohľadu zhora vidíme akési kruhy poukladané na sebe. Poznáme polomer najväčšej vrstvy a číslo, ktoré označuje rozdiel medzi dvoma nasledujúcimi vrstvami. Pomôžeme si kreslením rôznofarebných kruhov, aby sme dobre videli hranice vrstiev. Napríklad takto sú znázornené dve torty, trojposchodová a sedemposchodová.
Každé poschodie musí byť celé položené na predchádzajúcom, nemusia mať však rovnaký stred. Čo znamená, že ak sa na dve poschodia pozrieme zhora, uvidíme dva kruhy na sebe. Jeden väčší a jeden menší. Menší sa musí celý nachádzať na väčšom a žiadna jeho časť nesmie prečnievať von z väčšieho kruhu. Táto vlastnosť platí pre všetky poschodia. Menšie poschodie nesmie prečnievať z väčšieho. Najprv nakreslíme prvý kruh náhodnej farby so zadaným polomerom. Druhý kruh má stred od stredu prvého kruhu vzdialený maximálne o rozdiel medzi vrstvami, aby po vykreslení nemohol prečnievať. Teda korytnačka môže spraviť maximálne "rozdiel krokov a to ľubovoľným smerom. Ak prejde presne "rozdiel krokov hranice dvoch kruhov budú mať spoločný práve jeden bod. Vždy však menší kruh zostane vnútri väčšieho a nikdy nebude menší prečnievať. Stred druhého kruhu máme teda určený. Aby sme ho mohli nakresliť, potrebujeme vedieť ešte jeho polomer. Stačí len parameter polomer zmenšiť o parameter rozdiel, čo vyplýva aj z pomenovania parametra rozdiel. Zákazník chce aby bola torta čo najvyššia. Teda kým je polomer kladný, kreslíme ďalšie kruhy. ;Imagine logo
viem kresli_tortu :polomer :rozdiel kym [:polomer > 0] [ nechFp ? kruh :polomer*2 vp ? do náhodne :rozdiel urobTu "polomer :polomer - :rozdiel ] koniec
#Python import turtle import random def kresli_tortu(polomer, rozdiel): ''' :param polomer: polomer najväčšej vrstvy torty :type polomer: float :param rozdiel: rozdiel medzi polomermi v dvoch po sebe nasledujúcich vrstvách :type rozdiel: float ''' korytnacka = turtle.Turtle() korytnacka.penup() plocha = turtle.Screen() plocha.colormode(255) while (polomer > 0): farba = (random.randrange(256), random.randrange(256), random.randrange(256)) korytnacka.fillcolor(farba) korytnacka.dot(polomer*2, farba) korytnacka.right(random.randrange(360)) korytnacka.forward(random.randrange(rozdiel)) polomer = polomer - rozdiel plocha.mainloop() Vaše zaujímavé riešenia a najčastejšie chyby Úlohu riešilo 29 tímov, z toho 10 tímov z kategórie expert a 19 tímov z kategórie profík. Vo všeobecnosti sa im podarilo sa s úlohou dobre popasovať. 15 tímov dosiahlo aspoň 3 body. Najčastejšie sa strácali body na detailoch. Veľakrát si riešitelia neuvedomili, alebo možno len do riešenia neuviedli, že poschodia torty môžu byť na sebe poukladané akokoľvek a vykresľovali len sústredné kruhy, alebo ich zarovnávali k jednému alebo striedavo k dvom okrajom a podobne. Jednoznačne je najfrekventovanejšou chybou, ktorá sa vyskytla asi u polovice tímov, používanie parametra :polomer v príkaze bod (resp. kruh ), pričom tieto príkazy požadujú ako parameter priemer bodu. Taktiež sa často objavil problém pri počte iterácií v cykle. Často zadali podmienku (div :polomer :rozdiel). Správny počet iterácii pri tejto podmienke je len ak je :polomer deliteľný :rozdielom. Inak sa vykresľuje práve o jeden kruh menej. Len u zopár riešení došlo k prečnievaniu menších kruhov cez väčšie a to buď pri nesprávnej podmienke v cykle alebo pri nesprávnom určení dovoleného kroku korytnačky. Našli sa aj také riešenia, ktoré kreslili torty len s pevným počtom poschodí. A dokonca aj také, ktoré vždy vykreslili tú istú tortu. Zadaniu neporozumelo 5 tímov. Vykresľovali bočný pohľad na tortu, ako je na ilustračnom obrázku v zadaní. Ani jednému sa to však nepodarilo urobiť správne. |
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |