Autorské riešenie
[stiahni imp : py]

  • Počet riešiteľov: 26 / 29 = 90 %

  • Úspešnosť riešenia: 4,8 / 6 = 0,8 %

Cieľom tejto úlohy je nakresliť ozdobný vzor na šál podľa zadanej dĺžky vzoru a šírky šálu. Nasledujúce obrázky znázorňujú tento ozdobný vzor.

na obrázku je ozdobný vzor s dĺžkou vzoru 6

na obrázku je ozdobný vzor s dĺžkou vzoru 6

Je ľahké všimnúť si, že vo vzore na šále sa pravidelne opakuje štvorec, ktorý je otočený o 45° vzhľadom na celý vzor. Pri kreslení štvorcov z ľava do prava má každý ďalší štvorec ľavý vrchol v strede predchádzajúceho štvorca. Dĺžka vzoru je určená počtom štvorcov vo vzore.

Vytvoríme si pomocnú procedúru/funkciu pre kreslenie stvorca. Aby sme si uľahčili kreslenie celého vzoru, budeme samotný štvorec kresliť pootočený.

;Imagine logo
viem otoceny_stvorec :velkost
  vl 45
  opakuj 4 [
    do :velkost
    vp 90
  ]
  vp 45
koniec
#Python
def otoceny_stvorec(strana):
    k.left(45)
    for i in range(4):
        k.forward(strana)
        k.right(90)
    k.right(45)

Jedným z parametrov pre kreselnie vzoru na šále je šírka šálu. Šál je taký široký, aká dlhá je uhlopriečka štvorca, čo vidieť na nasledujúcom obrázku.

na obrázku je znázornený parameter :sirkaSalu (resp. sirka_salu) ako uhlopriečka štvorca

Aby sme vedeli využíť procedúru/funkciu pre kreslenie štvorca, potrebujeme vypočítať dĺžku strany štvorca. Uhlopriečka rozdeľuje štvorec na 2 pravouhlé rovnoramenné trojuholníky, pričom uhlopriečka je ich preponou. Použiutím Pytagorovej vety vieme vypočítať dĺžku strany štvorca nasledovne:

vzorec

Dĺžka celého vzoru je určená počtom štvorcov v ňom. Stačí teda v cykle kresliť otočené štvorce a posúvať sa o polovicu uhlopriečky štvorca, t.j. o polovicu šírky šálu. Každý ďalší štvorec začína v strede uhlopriečky toho predchádzajúceho.

na obrázku je znázornený posun medzi štvorcami o polovicu uhlopriečky

Výsledná verzia procedúry/funkcie pre kreslenie vzoru môže vyzerať nasledovne:

;Imagine logo
viem sal :sirka_salu :dlzka_vzoru
  urobTu "strana_stvorca :sirka_salu / odmocnina 2
  opakuj :dlzka_vzoru[
    pd
    otoceny_stvorec :strana_stvorca
    ph
    do :sirka_salu / 2
  ]
  vz :dlzka_vzoru * :sirka_salu / 2
koniec
#Python
def sal(sirka_salu, dlzka_vzoru):
    strana_stvorca = sirka_salu / 2 ** 0.5
    for i in range(dlzka_vzoru):
        k.pendown()
        otoceny_stvorec(strana_stvorca)
        k.penup()
        k.forward(sirka_salu / 2)
    k.backward(dlzka_vzoru * sirka_salu / 2)

Po vykreslení celého vzoru je vhodné vrátiť korytnačku naspäť na pôvodné miesto. V cykle sme sa posúvali o vzdialenosť sirka_salu / 2 celkovo dlzka_vzoru krát.

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

Túto úlohu riešilo 26 tímov, z toho 12 tímov v jazyku Imagine a 14 tímov v jazyku Python, pričom v jazyku Python bola úspešnosť len o 0,04% vyššia. Celkovo hodnotíme túto úlohu za úspešnú a dobre zvládnutú. Všetky tímy kreslili opakujúce sa štvorce.

Riešenia boli rôzne. 2 tímy kreslili štvorce zľava doprava. 7 tímov riešilo túto úlohu cez posuny polovičnej dĺžky strany štvorca - ako je 2. vzorové riešenie. 14 tímov riešilo túto úlohu cez posun po uhlopriečke, ktorý počítali cez odmocninu, resp. použili násobenie číslom 1,42, čo síce je približne odmocnina z 2, avšak pri väčších rozmeroch šálu toto zaokrúhlenie spôsobuje viditeľné nepresnosti v kreslení.

Takmer polovica tímov používala parameter šírka ako dĺžka strany štvorca. Aj takýto variant riešenia sme uznali bez straty bodov, aj keď sa nejedná priamo o šírku šálu.

Niekoľko tímov nepoužilo parametre vôbec, prípadne použili len jeden parameter a druhý podľa neho dopočítavali, alebo ho nechali ako konštantu.

Trom tímom sa nepodarilo naprogramovať rovnaký vzor ako v zadaní, čo spôsobili nesprávne posuny medzi štvorcami.

Medzi ďalšie chyby, ktoré sa opakujú takmer v každej úlohe, ale nepovažujeme ich za menej dôležité patrí používanie globálnych premenných na miestach, kde úplne stačia lokálne premenné. Je pravdepodobné, že väčšina tímov nerozumie správne významu a použitu procedúry, resp. funkcie, a vo väčšine riešení korytnačka skončí na mieste a v otočení takom, ako skončila svoje vykonávanie a chýba jej vrátenie sa na počiatočné miesto a otočenie do počiatočného smeru, čo je možné vidieť aj v galérií k tejto úlohe. Okrem toho používajú v procedúre/funkcii príkazy "domov", "zmaž", "znovu". Vyskytli si aj nesprávne pomenovania procedúry/funkcie alebo súboru.