Autorské riešenie
[stiahni imp : py]

  • Počet riešiteľov: 29 / 33 = 88%

  • Úspešnosť riešenia: 2,67 / 5 = 53,4%

Ú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á.

návrh výstupu

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.