Autorské riešenie
[stiahni]

Ozdobný kvietok pozostáva zo šesťuholníkov zoskupených vo vrstvách so striedavou bielou a žltou výplňou. Na vykreslenie celého kvietka vytvoríme 2 pomocné príkazy - jeden na vykreslenie šesťuholníka a druhý na vykreslenie jednej vrstvy šesťuholníkov.

obrazok sestuholnikoveho kvietka

Šesťuholník s dĺžkou strany a vykreslíme pomocou príkazu sestuholnik nasledovne:

viem sestuholnik :a
  polygon [
    opakuj 6 [do :a vp 60]
  ]
koniec

N-tá vrstva šesťuholníkov (pre n>1) pozostáva zo šiestich na seba nadväzujúcich radov šesťuholníkov. V každom z týchto radov je n-1 šesťuholníkov. Pri vykresľovaní n-tej vrstvy musíme zohľadňovať, či je párna alebo nepárna. Zistíme to pomocou výsledku výrazu mod :n 2 = 0. Na základe týchto úvah vytvoríme príkaz vrstva na vykreslenie n-tej vrstvy šesťuholníkov:

viem vrstva :n :a
  vl 30
  opakuj 6 [
    opakuj :n-1 [
      ak2 mod :n 2 = 0 [nechFv "zlta]
                       [nechFv "biela]
      sestuholnik :a
      vl 60
      vz :a
      vp 60
      vz :a
    ]
    do :a
    vp 60
  ]
  vp 30
koniec

Napokon celý kvietok vykreslíme tak, že pre zadané n budeme v cykle vykresľovať druhú až n-tú vrstvu šesťuholníkov. Výsledný príkaz kresli na vykreslenie celého kvietka vyzerá nasledovne:

viem kresli :n :a
  opakuj :n-1 [
    vrstva pocitadlo+1 :a
    vl 30
    do :a
    vp 60
    do :a
    vl 30
  ]
koniec

Celkový počet šesťuholníkov, z ktorých pozostáva kvietok s n vrstvami, môžme vypočítať rôznymi spôsobmi. Jedno riešenie je také, že pri každom volaní procedúry sestuholník budeme zvyšovať o 1 obsah globalnej premennej. Na konci vykreslenia bude v tejto premennej celkový počet vykreslených šesťuholníkov. Iné, viac matematické riešenie spočíva v tom, že si vyjadríme celkový súčet šesťuholníkov po vrstvách. V 1.vrstve je 1 šesťuholník, v 2.vrstve 6 šesťuholníkov, v 3.vrstve 2·6 šesťuholníkov, vo 4.vrstve 3·6 šesťuholníkov, ... v n-tej vrstve (n-1)·6 šesťuholníkov. Spolu v n vrstvách je počet šesťuholníkov 1 + 1·6 + 2·6 + 3·6+ 4·6+ ... + (n-1)·6. Po ďalšej úprave vyňatím činiteľa 6 pred zátvorku dostaneme 1 + 6·(1 + 2 + 3 + 4 + ... + (n-1)). Napokon použitím jednej finty upravíme aj súčet v zátvorke a dostaneme výsledok 1 + 6·(n-1)·n/2 a po úprave celkový súčet 1+3·(n-1)·n.

O akú fintu ide? Traduje sa historka, ako slávny nemecký matematik Karl Friedrich Gauss (http://sk.wikipedia.org/wiki/Carl_Friedrich_Gauß) vo veku 9 rokov ako zázračné dieťa veľmi rýchle určil súčet čísel od 1 do 100. Najprv napísal do radu čísla od 1 do 100, pod tento rad napísal tie isté čisla, ale v klesajúcom poradí t.j. od 100 do 1:
  1  2  3 ... 99 100
100 99 98 ...  2   1

Čísla sčítaval po stĺpcoch. V každom stĺpci je súčet 101 a počet stĺpcov je 100. Potom súčet čísel v oboch riadkoch je 100·101. Keďže súčet čísel prvom aj druhom riadku je rovnaký, súčet čísel v prvom riadku bude polovicou celkoého súčtu t.j. 100·101/2. Rovnakou úvahou dôjdeme k vypočítaniu súčtu 1 + 2 + 3 + 4 + ... + (n-1), ktorý je rovný (n-1)·n/2.

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

Do riešenia tejto úlohy sa pustilo 9 tímov. Len dva tímy vedeli vypočítať súčet šesťuholníkov. V dvoch riešeniach sa objavilo aj ošetrenie vstupu pre vykreslenie kvietku s počtom vrstiev n>0.

Najčastejšie nedostatky, ktorých ste sa dopustili vo svojich riešeniach a naše odporúčania:

  • správne vykreslenie kvietku len pre niektoré hodnoty n (počet vrstiev),
  • nepresné vykresľovanie šesťuholníkov napr. sa prekrývajú,
  • pri riešení ste používali globálne premenné namiesto lokálnych, t.j. v priradení ste použili príkaz urob namiesto príkazu urobTu,
  • v niektorých riešeniach sa vyskytli pomocné príkazy, ktoré nesúviseli s riešením, preto odporúčame aby ste nabudúce nepotrebné príkazy vymazali z projektu,
  • neprehľadný zápis príkazov - odporúčame odsadzovať príkazy (hlavne pri viacerých vnorených cykloch),
  • namiesto troch vnorených príkazov cyklu skôr použiť procedúry, je to prehľadnejšie a odporúčame to hlavne začínajúcim programátorom.