Autorské riešenie
[stiahni]

  • Počet riešiteľov: 25 / 39 = 64,1 %

  • Úspešnosť riešenia: 3,44 / 5 =  68,8 %

Ak chceme vytvoriť program na vykreslenie vzoru výšivky uvedeného na obrázku, mali by sa najprv poriadne pozrieť na obrázok (Obr 1.) a nájsť v ňom časti, ktoré sa opakujú.

Obr 1. Vyšívka

Na ďalšom obrázku (Obr 2.) vyznačujeme vzor, ktorý sa opakuje.

Obr 2. Vyšívka z vyznačením opakujúcich sa častí (vzory)

Ak pozeráme dôslednejšie, tak aj v nájdenom vzore nájdeme ešte menší vzor, ktorý zrkadlovým obrazom druhej časti vzoru (pozri Obr 3.)

Obr 3. Menšia časť s vyznačením ešte menších časti (vzor)

Pri ešte dôslednejšom pohľade vidíme, že aj tento vzor sa skladá z rovnakých menších častí (pozri Obr 4.)

Obr 4. Najmenšía časť obrázku (miniVzor)

Po tomto viacnásobnom "röntgenovom" pohľade sa nám podarilo určiť časti, ktoré sa opakujú v obrázku a tiež časti, ktoré sú súčasťou iných častí.

Teraz poďme z menších "tehličiek" skladať väčšie. Postupne budeme vytvárať procedúry na kreslenie - miniVzoru (Obr 4.), vzoru (Obr 3.) a vzorov (Obr 2.) MiniVzor budeme kresliť zo stredu. Procedúra miniVzor na jeho vykreslenie môže vyzerať, napr. takto:

viem miniVzor :dlzka

  vpravo 45
  dopredu -:dlzka
  dopredu :dlzka
  vpravo -90
  dopredu -:dlzka
  dopredu :dlzka
  vpravo 45

koniec

Procedúra vzor na vykreslenie vzoru (Obr 3.) môže vyzerať, napr. takto:

viem vzor :dlzka

  opakuj 2 [
    opakuj 2 [
      peroDolu
      miniVzor :dlzka
      peroHore
      posun :dlzka
    ]
    vpravo 180
  ]

koniec

Na posunutie sa na ďalšiu pozíciu miniVzoru použijeme procedúru posun, ktorá sa neposúva priamo v smere (pre tých, čo nepoznajú Pytagorovú vetu):

viem posun :dlzka

  vlavo 45
  dopredu :dlzka/2
  vlavo -90
  dopredu :dlzka/2
  vlavo 45

koniec

Na vykreslenie celej výšivky napíšeme procedúru vzory, v ktorej môžeme na začiatku ošetriť vstupné parametre, a tiež zabezpečiť návrat na pôvodné miesto kreslenia.

viem vzory :pocet :dlzka
  ; znova nechHp 5 vzory 3 40

  ak (alebo :pocet<=0 :dlzka<=0 :pocet<>cela :pocet :dlzka<>cela :dlzka) [
    pis "|Zadaj kladne cele cisla vstupov |
    ukonci
  ]

  vpravo 90

  opakuj :pocet [
    vzor :dlzka
    posun 4*:dlzka
  ]

  vpravo 180
  posun 4*:pocet*:dlzka
  vpravo 90

koniec

Táto súťažná úloha je zameraná na použitie stratégií riešenia problémov (rozlož problém do podproblémov, nakresli si obrázok) a tiež na výpočty vzdialeností, použitie príkazu opakovania a procedúr s parametrami.

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

Do riešenia tejto úlohy sa zapojilo 25 tímov, z toho 10 tímov dosiahlo plný počet bodov (max 5 bodov). Celkový priemer úspešnosti riešení bol 3,44 bodov z maximálneho počtu 5 bodov (68,8% úspešnosť).

Len tím ikztzu zabezpečil, že pri vykreslení výšivky sa korytnačka vráti na pôvodnú pozíciu, za čo ich chválime. Pri výpočte posunu medzi časťami obrázku 4 tímy použili matematickú funkciu omocnina/sqrt. Až v 12 riešeniach neboli použité procedúry na vykreslenie menších časti výšivky.

Nedostatky, ktoré sme našli v riešeniach súťažiacich:

  • nepresneosti pri vykresľovaní vzoru - niektorí zabudli na koncovú časť, iným chýbali niektoré kosoštvorce vo vnútri vzorov,
  • namiesto uvedenia parametrov boli použité náhodné čísla,
  • neefektívne použitie príkazov v tele cyklu, ktoré mali byť pred cyklom, napr. nechHp,
  • zbytočné používanie globalnych premenných,
  • nemnemotechnické jednopísmenkové pomenovanie premenných,
  • názvy premenných písané veľkými aj malými písmenami (v niektorých jazykoch sa rozlišujú veľkosti písmen v menách premenných, funkciách ...),
  • neprehľadný zápis programu - veľa príkazov v jednom riadku, nedôsledné odsadenie príkazov,
  • použitie vyhradených slov jazyka na pomenovanie procedúr, napr. koniec.