Autorské riešenie
[stiahni]

Riešenie tejto úlohy pozostáva z vyriešenia niekoľkých menších úloh. Najprv vyriešime výpočtovú časť úlohy, neskôr kresliacu.

Zo zadania vieme, že v prvom týždni vyrastie na stonke pichľavky 1 tŕň a takisto aj v druhom týždni vyrastie iba 1 tŕň. Počet tŕňov, ktoré vyrastú v každom ďalšom týždni sa rovná súčtu tŕňov, ktoré zostali z predchádzajúcich dvoch týždňov. To znamená, že v treťom týždni vyrastú 2 tŕne, v nasledujúcom týždni 3 tŕne a v ďalších týždňoch postupne vyrastá 5, 8, 13, 21 tŕňov. Tieto čísla tvoria Fibonacciho postupnosť. Inými slovami, keď hľadáme počet tŕňov, ktoré vyrastú na stonke pichľavky v n-tom týždni, počítame n-té Fibonacciho číslo. Uvedieme procedúru kresliPichľavku, ktorú ešte neskôr upravíme:

viem kresliPichlavku :tyzden
 ak :tyzden >= 3 [
  urobTu "predPredTyzden 1
  urobTu "predTyzden 1
  opakuj :tyzden - 2 [
   urobtu "tentoTyzden :predPredTyzden + :predTyzden
   urobTu "predPredTyzden :predTyzden
   urobTu "predTyzden :tentoTyzden
  ]
 ]
koniec

Vieme, že tŕne rastú striedavo, jeden týždeň na jednej strane stonky, druhý týždeň na druhej. Preto si vytvoríme procedúry kresliTrne a kresliPlody, ktoré budú mať 2 parametre. V jednom si budeme pamätať počet tŕňov, resp. plodov, ktoré potrebujeme nakresliť. Druhý parameter bude slúžiť na to, aby sme splnili podmienku, že tŕne (aj plody, ktoré nahrádzajú päticu tŕňov za sebou) vyrastajú striedavo na jednej a druhej strane. Procedúry kresliTrne a kresliPlody môžu vyzerať napr. takto:

viem kresliTrne :pocet :uhol
 opakuj :pocet [
  vp :uhol
  do 10
  vz 10
  vl :uhol
  do 10
 ]
koniec

viem kresliPlody :pocet :uhol
 opakuj :pocet [
  vp :uhol
  do 5
  bod 10
  vz 5
  vl :uhol
  do 10
 ]
koniec

Navyše, ak sa na jednej strane stonky objaví 5 tŕňov za sebou, odpadnú a na ich mieste vyrastie plod. Tŕne, ktoré sme nahradili plodom nás prestávajú zaujímať. Na základe toho upravíme časť procedúry kresliPichlavku a doplníme tiež časť procedúry, ktorá pichľavú rastlinku nakrelí:

viem kresliPichlavku :tyzden
 ak :tyzden >= 1 [
  kresliTrne 1 45
 ]
 ak :tyzden >= 2 [
  kresliTrne 1 -45
 ]
 ak :tyzden >= 3 [
  urobTu "predPredTyzden 1
  urobTu "predTyzden 1
  opakuj :tyzden - 2 [
   urobtu "tentoTyzden :predPredTyzden + :predTyzden
   ak2 zvysok pocitadlo 2 = 1 [
    urobTu "uhol 45
   ][
    urobTu "uhol -45
   ]
   kresliTrne zvysok :tentoTyzden 5 :uhol
   kresliPlody cPodiel :tentoTyzden 5 :uhol
   urobTu "predPredTyzden :predTyzden
   urobTu "predTyzden zvysok :tentoTyzden 5
  ]
 ]
koniec

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

Viacerým tímom sa podarilo vyriešiť iba špeciálny prípad - nakrelili n-týždňovú pichľavku pre konkrétne n. Niektoré tímy vyriešili základ celej úlohy - vytvorili procedúru na nájdenie n-tého Fibonacciho čísla - týmto tímom sme dali polovicu bodov.

Zaujímavosťou je, že žiaden tím nevyriešil túto úlohu tak, ako je uvedené v autorskom riešení (hoci sme vedeli, že úlohu je možné interpretovať viacerými spôsobmi). Tri tímy (expert JM&JM, expert Baša a Saša a Michal Bali) však dôkladne prepracovali svoje riešenie, preto sme im udelili plný počet bodov.