Autorské riešenie
[stiahni [imp][py]]

  • Počet riešiteľov: 19 / 22 = 86 %

  • Úspešnosť riešenia:  5,3 / 6 = 87,7 %

Podľa zadania máme nakresliť jednoduchú grafickú podobu panáčika cvičiaceho niektorý zo zadaných cvikov s rukami (pripažiť, vzpažiť, rozpažiť, predpažiť). Pre jednoduchosť budeme panáčika vykresľovať z jedného bodu, z ktorého vyrastá 5 dielov tela (hlava, ruky, nohy) ako je to znázornené na obrázku.

pripažiť   vzpažiť   rozpažiť   predpažiť

Pre vykreslenie jednotlivých dielov tela použijeme procedúru diel_tela, ktorú uvádzame v pseudokóde bez parametrov (dĺžky a farby):

procedúra diel_tela:
  dopredu
  kruh
  peroHore
  vzad
  peroDolu

Pár končatín (ruky, resp. nohy) z pozície, keď je pero natočené smerom na sever vykreslíme takým spôsobom, ktorý je znázornený na dolnom obrázku. Najprv sa natočíme vpravo o zadaný uhol a vykreslíme diel tela. Potom sa natočíme vpravo o hodnotu 360 - 2 . uhol a vykreslíme ďalší diel tela. Napokon sa natočíme vpravo o zadaný úhol, čím budeme opäť natočení na sever.

Náčrt

Procedúra par_koncatin vykresľujúca nohy, resp. ruky môže byť zapísaná, napr. nasledovným pseudokódom, v ktorom neuvádzame parametre (dĺžky a farby):

procedúra par_koncatin:
  vpravo uhol
  diel_tela
  vpravo 360 - 2 * uhol
  diel_tela
  vpravo uhol

Napokon panáčika s daným cvikom rúk vykreslíme pomocou procedúry panacik s napr. nasledovným pseudokódom:

procedúra panacik:
  nohy
  ruky  
  hlava

Jednotlivé cviky sa odlišujú len inou polohou rúk. Nohy vykreslíme ako pár končatín pod uhlom 175 stupňov od severu. Ruky vykreslíme pod rôznymi uhlami v závislosti od zadaného cviku (pripažiť: 170 stupňov, vzpažiť: 10 stupňov, rozpažiť: 90 stupňov, predpažiť: 90 stupňov). V prípade cviku predpažiť je skrátená dĺžka rúk.

Náčrt

Výsledné riešenie tejto úlohy zapísané v jazyku Imagine Logo môže vyzerať napríklad takto:

;Imagine Logo

viem diel_tela :dlzka :priemer :farba
  ;vykreslí úsečku s kruhom na konci zadanej dĺžky, na konci ktorej sa vykreslí kruh so zadaným priemerom a zadanou farbou
  nechFarbaPera "čierna
  dopredu :dlzka
  nechFarbaPera :farba
  kruh :priemer
  peroHore
  dopredu -:dlzka
  peroDolu
koniec

viem par_koncatin :dlzka :priemer :farba :uhol
  ;vykreslí dvojicu úsečiek zadanej dĺžky odklonených od severu na obe strany o zadaný uhol, na konci ktorých sa vykreslia kruhy so zadaným priemerom a zadanou farbou
  vpravo :uhol
  diel_tela :dlzka :priemer :farba
  vpravo 360 - 2 * :uhol
  diel_tela :dlzka :priemer :farba
  vpravo :uhol
koniec

viem panacik :velkost :poloha
  ;vykreslí panáčika so zadanou veľkosťou v zadanom cviku s rukami
  ;nohy
  par_koncatin 3 * :velkost :velkost / 8 "modrá 175
  ;ruky
  akJe :poloha [
    pripažiť [par_koncatin 2 * :velkost :velkost / 8 "červená 170]
    vzpažiť [par_koncatin 2 * :velkost :velkost / 8 "červená 10]
    rozpažiť [par_koncatin 2 * :velkost :velkost / 8 "červená 90]
    predpažiť [par_koncatin :velkost / 16 :velkost / 8 "červená 90]
  ]
  ;hlava
  diel_tela :velkost :velkost / 2 "oranžová
koniec

viem štart
  znova
  nechFarbaPera "čierna
  urobTu "cvik ?prvok [pripažiť vzpažiť rozpažiť predpažiť]
  peroDolu
  panacik 50 :cvik
  peroHore
  nechPoz [0 100]
  nechFarbaPera "čierna
  text :cvik
koniec

A riešenie úlohy zapísané v jazyku Python môže vyzerať nasledovne:

import turtle, random

def diel_tela(dlzka, priemer, farba):
    '''
    vykreslí úsečku s kruhom na konci
    :param dlzka: dĺžka dielu tela z množiny {hlava, ruka, noha}
    :type  dlzka: float
    :param priemer: priemer kruhu na konci úsečky
    :type  priemer: float
    :param farba: farba kruhu na konci úsečky
    :type  farba: float
    '''
    kor.forward(dlzka)
    kor.dot(priemer,farba)
    kor.penup()
    kor.forward(-dlzka)
    kor.pendown()

def par_koncatin(dlzka, priemer, farba, uhol):
    '''
    vykreslí 2 úsečky s kruhmi na konci odklonené od severu na obe strany
    :param dlzka: dĺžka dielu tela z množiny {hlava, ruka, noha}
    :type  dlzka: float
    :param priemer: priemer kruhu na konci úsečky
    :type  priemer: float
    :param farba: farba kruhu na konci úsečky
    :type  farba: str
    :param uhol: uhol, o ktorý sú otočené obe úsečky od severu na obe strany
    :type  uhol: float
    '''
    kor.right(uhol)
    diel_tela(dlzka, priemer, farba)
    kor.right(360 - 2 * uhol)
    diel_tela(dlzka, priemer, farba)
    kor.right(uhol)

def panacik(velkost, poloha):
    '''
    vykreslí panáčika so zadanou veľkosťou v zadanom cviku s rukami
    :param velkost: od tejto hodnoty sú odvodené dĺžky ostatných častí tela
    :type  velkost: float
    :param poloha: hodnota z {predpažiť, vzpažiť, rozpažiť, pripažiť}
    :type  poloha: str
    '''
    #nohy
    par_koncatin(3 * velkost, velkost / 8, "blue", 175)
    #ruky
    if poloha == "pripažiť":
        par_koncatin(2 * velkost, velkost / 8,  "red", 170)
    elif poloha == "vzpažiť":
        par_koncatin(2 * velkost, velkost / 8,  "red", 10)
    elif poloha == "rozpažiť":
        par_koncatin(2 * velkost, velkost / 8,  "red", 90)
    elif poloha == "predpažiť":
        par_koncatin(velkost / 16, velkost / 8, "red", 90)
    #hlava
    diel_tela(velkost, velkost / 2, "orange")

kor = turtle.Turtle()
obrazovka = turtle.Screen()
kor.speed(0)
kor.left(90)
kor.hideturtle()

cvik = random.choice(["pripažiť", "vzpažiť", "rozpažiť", "predpažiť"])
panacik(100, cvik)
kor.penup()
kor.setposition(0, 200)
kor.write(cvik, align = "center", font = ("Arial", 10, "bold"))

obrazovka.mainloop()

Táto súťažná úloha je zameraná na dôslednu analýzu matematického problému, na výpočty využívajúce uhly, na použitie stratégie dekompozície riešenia problému do riešenia podproblémov, na precvičenie použitia procedúr, resp. funkcií s parametrami, príkazov vetvenia a korytnačej grafiky.

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

Do riešenia tejto úlohy sa zapojilo 9 tímov z kategórie PROFÍK a 10 tímov z kategórie EXPERT. Plný počet bodov získalo až 11 tímov. Súťažiaci dosiahli priemerný počet 5,3 bodu z možných 6 bodov. Všetkých 19 tímov riešilo úlohu v jazyku Imagine Logo. Z toho 5 tímov riešilo úlohu iným spôsobom ako je uvedené autorské riešenie. Jednotlivé cviky si vopred pripravili a pomocou jednej alebo štyroch korytnačiek ich odtláčali do plochy. Niekoľko tímov vykreslilo cvik predpažiť zboku nie spredu ako ostatné cviky, čo považujeme tiež za akceptovateľné riešenie. Obzvlášť oceňujeme súťažiaceho Bubák v. 5 za súčasné zobrazenie všetkých cvikov z predného aj bočného pohľadu.

V riešeniach sme zaregistrovali nasledovné nedostatky:

  • väčšina tímov použila 4 príkazy AK za sebou,  efektívnejšie je však použiť jeden príkaz AKJE alebo vnorené príkazy AK2,

  • niektoré tímy nepoužili procedúry pre vykreslenie jednotlivých cvikov, ale vykresľovali všetky cviky pomocou jednej, prípadne dvoch procedúr,

  • niektoré tímy nerozpoznali, že jednotlivé cviky sa líšia len polohou rúk a zbytočne opisovali v procedurách programový kód pre nemeniace sa časti tela,

  • v nieľkoľkých riešeniach sme zaregistrovali použitie globálnych premenných (vytvorených pomocou príkazu UROB), ktorým sa odporúčame čo najviac vyhýbať,

  • niektorí súťažiaci radi používajú jednopísmenové názvy premenných, kvôli prehľadnosti kódu však odporúčame používať viacpísmenové zmysluplné názvy premenných, ktoré výstižne vyjadrujú premenné podľa ich významu v programe,

  • v niektorých riešeniach neboli zobrazovaní panáčikovia rovnakej veľkosti pri rôznych cvikoch.

  • v zopár riešeniach súťažiaci zabudli uviesť názvy cvikov.