Autorské riešenie
[stiahni py]

  • Počet riešiteľov: 3 / 5= 60 %

  • Úspešnosť riešenia: 4 / 4 = 100%

Podľa zadania máme naprogramovať vyšívanie štvorcového motívu, zobrazeného na obrázkoch nižšie.

Je viacero spôsobov, ako riešiť túto úlohu. Dá sa to riešiť napríklad:

  • Použitím funkcie, ktorá vykreslí najprv hornú časť štvorčekov v jednom riadku a spätne dolnú časť (resp. ľavú a pravú, ak vykresľujeme po stĺpcoch). Túto funkciu potom voláme v cykle toľkokrát, koľko určuje parameter pre počet riadkov vyšívky. Tento spôsob nemusí byť riešený funkciou, môžeme tiež použiť vnorený cyklus.

  • Vykresľovaním celých štvorčekov po riadkoch (resp. stĺpcoch), kedy sú susedné štvorčeky spojené vrcholmi. Toto vykresľovanie môže prebiehať vo vnorenom cykle alebo použitím funkcie volanej v cykle.

  • Diagonálnym vykresľovaním. Teda vykresľujeme štvorčeky, ktoré so susednými štvorčekmi nie sú spojené vrcholmi, ale hranami. V tomto prípade potrebujem výpočet pre počet štvorčekov na konkrétnej diagonále.

  • Vykresľovaním obdĺžnikov. Na tento spôsob sa pozrieme nižšie.

Na obrázku vyššie vidíme motívy výšivky otočené o 45°. Vidíme, že parameter určujúci počet štvorčekov v riadku, resp. stĺpci pre pôvodný motív, nám určuje počet obdĺžnikov pre otočený motív. Potrebujeme ešte dĺžky strán jednotlivých obdĺžnikov. Vykresľovanie začína obĺžnikom, kde dĺžka jednej strany je dĺžka strany štvorčeka a dĺžka druhej strany je počet štvorčekov na diagonále pôvodného motívu. Veľkosti strán obdĺžnika sa každou iteráciou menia - jedna sa zväčší, druhá zmenší o dvojnásobok dĺžky strany štvorčeka.

Pri vykresľovaní nám stačí na začiatku nastaviť otočenie o 45°, čím dostaneme požadovaný motív. Otočenie motívu môžeme použiť v každom vyššie spomenutom spôsobe.

Výsledný program môže vyzerať nasledovne:

import turtle

def obdlznik(strana_x,strana_y):
    for _ in range(2):
        pero.forward(strana_x)
        pero.left(90)
        pero.forward(strana_y)
        pero.left(90)

def vysivaj(dlzka_strany, pocet_v_riadku):
    pero.right(45)
    strana_x = dlzka_strany * (pocet_v_riadku * 2 - 1)
    strana_y = dlzka_strany
    for i in range(pocet_v_riadku):
        obdlznik(strana_x, strana_y)
        strana_x = strana_x - 2 * dlzka_strany
        strana_y = strana_y + 2 * dlzka_strany
        pero.penup()
        pero.forward(dlzka_strany)
        pero.right(90)
        pero.forward(dlzka_strany)
        pero.left(90)
        pero.pendown()


pero = turtle.Turtle()
pero.speed(0)
vysivaj(50, 3)
plocha.mainloop()

Táto úloha je zameraná na:

  • použitie stratégií riešenia problémov - nakreslenie obrázku, hľadanie vzoru, dekompozícia problému na podproblémy

  • precvičovanie príkazov volania funkcií s parametrami bez výstupu, for cyklu, korytnačej grafiky

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

Do riešenia tejto úlohy sa zapojili 3 tímy z kategórie EXPERT. Všetky tímy získali za túto úlohu plný počet bodov. Srdečne gratulujeme!

Všetky tímy pracovali s korytnačou grafikou. V riešeniach bolo krásne vidieť, ako rôzne členovia tímov rozmýšľajú. Každý z troch tímov mal jedinečné riešenie. Boli použité vyššie spomínané spôsoby, a to všetky okrem vykresľovania obdĺžnikov. V jednom z riešení bolo použité načítanie vstupov z konzoly. Zaujímavé bolo riešenie tímu takacpisko, ktorý použil až tri parametre, a to pre dĺžku strany jedného štvorčeka, výšku a šírku výšivky.

Každý z tímov splnil všetky požadované kritériá. Niektoré kódy by sa pri optimalizácii dali zjednodušiť využitím vlastností štvorcového motívu.