Autorské riešenie
[stiahni py]

  • Počet riešiteľov: 9 / 11 =  82 %

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

Podľa zadania máme vykresliť snehovú vločku so zadaným počtom ramien a zadanou vekosťou, pričom sa tieto ramená nemôžu prekrývať a ani dotýkať. Najprv si načrtnime obrázok s vločkou s konkrétnym počtom ramien (12) a konkrétnymi rozmermi jedného ramena (120 a 60) s hrubo vyznačeným jedným ramenom. Aby sme zohľadnili neprekrývania sa susedných ramien, načrtneme hraničnú situáciu, kedy sa jednotlivé ramená budú dotýkať (menej výraznou sivou farbou). Dotyk nastane, ak dĺžky vetiev na konci ramena budú rovnako veľké ako dĺžka ramena a dĺžky vetiev uprostred vetvy rovnako dlhé ako polovica dĺžky ramena. Ak tieto dĺžky proporcionálne skrátime (napr. na polovicu a štvrtinu dĺžky ramena) a rovnako dodržíme nastavenie správnych uhlov, tak ramená našej snehovej vloky by sa nemali prekrývať. Na tomto obrázku s kosoštvorcovou ružicou vidíme, že uhol medzi ramenami má veľkosť 360 / počet_ramien. Uhol vetiev (na konci aj uprostred ramena) od ramena by mal byť menší alebo rovný veľkosti 360 / počet_ramien.  

Náčrt obrázka vločky s 12 ramenami a veľkosťou 120'

Ak zohľadníme uvedené obmedzenia dĺžok a uhlov ramien vločky a jej vetiev, tak môžeme vytvoriť funkciu rameno na vykreslenie ramena so zadanou dĺžkou a uhlom vetiev od ramena a tiež funkciu vlocka so zadaným počtom a veľkosťou ramien.  

Výsledný program, ktorý môže vyzerať napríklad nasledovne:

import turtle


def rameno(dlzka, uhol):
    for i in range(1, 3):
        turtle.forward(dlzka / 2)
        turtle.left(uhol)
        turtle.forward(i * dlzka / 4)
        turtle.forward(-i * dlzka / 4)
        turtle.right(2 * uhol)
        turtle.forward(i * dlzka / 4)
        turtle.forward(-i * dlzka / 4)
        turtle.left(uhol)
    turtle.forward(-dlzka)


def vlocka(pocet, dlzka):
    for i in range(pocet):
        rameno(dlzka, 360 / pocet)
        turtle.right(360 / pocet)


vlocka(12, 120)
turtle.mainloop()

Táto úloha je zameraná na:

  • použitie stratégie riešenia problémov - dekompozíciu problému na podproblémy, hľadanie vzorov, nakreslenie si obrázka,

  • precvičenie príkazov volania funkcií s parametrami, cyklu for, príkazov korytnačej grafiky.

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

Do riešenia úlohy sa zapojilo 9 tímov z kategórie EXPERT. Plný počet bodov za svoje riešenie získalo až 6 tímov adolfov_squad, erikasasa_gl, karterura, neprogramatori, procrastinoters, a raketak, ktorým srdečne gratulujeme. Pri určovaní veľkosti ramena a vetiev súťažiaci pristupovali rôzne, niektorí za základnú veľkosť zozbrali dĺžku ramena, iní niektorú z vetiev. Ak riešenie zachovalo pomerné proporcie ramena a vetiev, tak sme ho uznali s plným počtom bodov

V riešeniach sme zaregistrovali nasledovné nedostatky, vychádzajúce najčastejšie z nedôslednej analýzy problému:

  • použitie až troch parametrov pri vykresľovaní ramena vločky, pričom sa nezabezpečilo neprekrývanie vetiev, t.j. nekontrolovalo sa či dĺžka prostrednej vetvy nebude väčšia ako dĺžka koncovej vetvy,

  • okrem násobenia a delenia použitie aj odpočítania konkrétnej hodnoty pri vykresľovaní ramena vločky, čo pri dĺžke ramena menšej ako konkrétna hodnota nezabezpečí neprekrývanie ramien,

  • použite zbytočných globálnych pomocných premenných,

  • použitie zbytočného ďalšieho parametra uhol, ktorý pre vykreslenie vločky podľa zadania musel byť nastavený na hodnotu 360,

  • roztrúsený menej prehľadný zápis hlavného programu, ten sa v Pythone zvykne písať pokope po definíciách funkcií,

  • použitie jednopísmenkových identifikátorov premenných, odporúčame používať zmysluplné názvy premenných (napr. dlzka, pocet, uhol).