Autorské riešenie
[stiahni py]                

  • Počet riešiteľov:  16 / 18 = 89 %

  • Úspešnosť riešenia: 3,1 / 6 = 52,1 %

Prvým a zároveň kľúčovým krokom pri riešení tejto úlohy je uvedomiť si, že hoci výsledný obrazec pozostáva z trojuholníkov, základná pečiatka (opakujúci sa vzor) má tvar obdĺžnika. Preto je potrebné určiť tento opakujúci sa prvok. Takýto základný vzor je znázornený na obrázku.

alternatívny text k obrázku

Po určení základného vzoru (pečiatky) by sme mali byť schopní tento vzor vykresliť. V našom prípade na to slúži funkcia opeciatkuj_vzor(dlzka), kde parameter dlzka predstavuje dĺžku strany trojuholníka.

#Python
  def opeciatkuj_vzor(dlzka):
       pero.forward(dlzka / 2)
       pero.right(60)
       pero.forward(dlzka)
       pero.right(60)
       pero.forward(dlzka)
       pero.right(120)
       pero.forward(dlzka)
       pero.right(120)
       pero.forward(dlzka)
       pero.forward(-dlzka)
       pero.left(60)
       pero.forward(dlzka)
       pero.right(60)
       pero.forward(dlzka / 2)
    

Takto vytvorený vzor následne pravidelne kopírujeme do riadkov a stĺpcov podľa zadaných parametrov, čím zabezpečíme aby sa vzor opakoval tak, že pokryje celú plochu. Na tento účel využijeme dva vnorené cykly.

Používame funkciu opeciatkuj(pocet_x, pocet_y, dlzka), kde parameter pocet_x určuje počet opakovaní na osi x (počet stĺpcov), parameter pocet_y počet opakovaní na osi y (počet riadkov) a parameter dlzka udáva veľkosť jednej hrany trojuholníka.

Po vykreslení jedného stĺpca vzorov je potrebné vrátiť korytnačku na začiatok stĺpca a následne ju posunúť doprava, aby mohla začať vykresľovať ďalší stĺpec. Tento posun závisí od výšky rovnostranného trojuholníka, ktorú vypočítame ako sqrt(3) × dlzka .

Po o dokončení celej mriežky sa korytnačka vráti na pôvodnú pozíciu.

#Python
  def opeciatkuj(pocet_x, pocet_y, dlzka):
     for x in range(pocet_x):
         for y in range(pocet_y):
             opeciatkuj_vzor(dlzka)   # vzor po stlpcoch
         
         # presun na ďalší stlpec
          pero.forward(-pocet_y * dlzka)
          pero.right(90)
          pero.penup()
          pero.forward(dlzka * 3 ** 0.5) # výška trojuholníka
          pero.left(90)
          pero.pendown()
          
     # návrat na pôvodnú pozíciu
     pero.left(90)
     pero.penup()
     pero.forward(dlzka * pocet_x * 3 ** 0.5)
     pero.right(90)
     pero.pendown()
      

Cieľom úlohy bolo rozpoznať opakujúci sa vzor a naučiť sa rozložiť zložitejší problém na menšie podproblémy. Riešenie viedlo k využitiu menších funkcií pre prehľadnosť a efektívnosť kódu. Dôležitou súčasťou bolo aj správne pracovať s parametrami a vytvoriť vzor v dvojrozmernej mriežke (riadky × stĺpce).

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

Úlohu riešilo celkom 16 tímov v kategórii GURU, pričom plný počet bodov sa podarilo dosiahnuť len tímu jama, ktorému srdečne gratulujeme. Najčastejšie sme neudelili body za nasledujúce skutočnosti:

  • Nenašli ste správny vzor, resp. vzor, ktorý ste našli bol málo efektívny alebo neúplny.
  • Neprehľadné a neefektívne riešenia.
  • Nesprávne alebo žiadne rozdelenie programu do podprogramov.