Autorské riešenie
[stiahni]

  • Počet riešiteľov: 19 / 20 = 95,00 %

  • Úspešnosť riešenia: 3,32 / 4 =  83,00 %

Úlohou bolo nakresliť stromček bielej farby na tmavomodrom pozadí. Strom má náhodnú hrúbku kmeňa a ľubovoľný počet vetvičiek, ktoré sa však smerom k vrcholu stromu skracujú. Jedno z riešení by mohlo vyzerať napríklad tak, že začneme príkazmi na nastavenie farby pera a náhodnej hrúbky pera:

   nechFarbaPozadia "modra
   nechFP "biela
   nechHP 2 + nahodne 3

Nakresliť kmeň stromu tiež nebude ťažké, preto sa pozrime na to, ako by sme mohli nakresliť vetvičku. Zatiaľ len jednu. Zrejme využijeme základné príkazy korytnačky na pohyb dopredu, dozadu a jej otočenie. Aby sme však vedeli kresliť vetvičky rôznej dĺžky, vytvoríme si pre vetvičku samostatnú procedúru s parametrom, ktorý sa bude nazývať dĺžka vetvičky. Procedúra na vykreslenie vetvičky by mohla vyzerať napríklad takto:

   viem vetvicka :dlzkaVetvicky
     vl 135
     do :dlzkaVetvicky
     vz :dlzkaVetvicky
     vl 90
     do :dlzkaVetvicky
     vz :dlzkaVetvicky
     vl 135
   koniec

Teraz už zvládneme nakresliť vetvičku rôznej dĺžky. Ako ich však budeme rozmiestňovať pozdĺž kmeňa stromu? Zrejme bude potrebné vytvoriť medzeru, ktorú budeme dodržiavať medzi dvoma susednými vetvičkami. Pre veľkosť tejto medzery si môžeme vytvoriť premennú :medzera. Každý kmeň stromu je však vo svojej spodnej časti bez vetvičiek. Preto prvú vetvičku nakreslíme až vo vzdialenosti rovnej napríklad trojnásobku premennej :medzera, ako to môžeme vidieť na nasledujúcom obrázku.

obrazok

Zatiaľ teda vieme naprogramovať takúto časť procedúry strom:

   viem strom :medzera
     skry
     znova
     nechFarbaPozadia "modra
     nechFP "biela
     nechHP 2 + nahodne 3
     do 3*:medzera
     vetvicka 50
   koniec

My by sme však chceli náhodný počet vetvičiek a aby sa vetvičky skracovali. Keďže chceme mať rozumnú dĺžku vetvičky, mala by mať aspoň dvojnásobnú hodnotu v porovnaní s hodnotou premennej :medzera. Skracovanie vetvičiek vykonáme tak, že dĺžku vetvičky po každom opakovaní vynásobíme náhodným číslom od 0,6 po 0,9. Vieme to naprogramovať napríklad takto:

   urobTu "pocetVetviciek 3 + nahodne 5
   urobTu "dlzkaVetvicky 2*:medzera + nahodne :medzera
   urobTu "skratenie (6 + nahodne 4)/10
   opakuj :pocetVetviciek [
     do :medzera
     vetvicka :dlzkaVetvicky
     urobTu "dlzkaVetvicky :skratenie*:dlzkaVetvicky
   ]

Celá procedúra na vykreslenie stromu môže teda vyzerať napríklad takto:

   viem strom :medzera
     skry
     znova
     nechFarbaPozadia "modra
     nechFP "biela
     nechHP 2 + nahodne 3
     urobTu "pocetVetviciek 3 + nahodne 5
     urobTu "dlzkaVetvicky 2*:medzera + nahodne :medzera
     urobTu "skratenie (6 + nahodne 4)/10
     do 3*:medzera
     opakuj :pocetVetviciek [
       do :medzera
       vetvicka :dlzkaVetvicky
       urobTu "dlzkaVetvicky :skratenie*:dlzkaVetvicky
     ]
     vz 3*:medzera + :pocetVetviciek*:medzera
   koniec

Vaše zaujímavé riešenia:

Úlohu sa pokúsilo vyriešiť 19 tímov, objavilo sa viacero ďalších správnych a zaujímavých postupov:

  • skracovanie vetvičiek pomocou postupného odpočítavania konštanty:
       urobtu "dlzka :pocet*:skratenie
       opakuj :pocet [
         vetvicka :dlzka
         urobTu "dlzka :dlzka - :skratenie
       ]
  • predlžovanie vetvičiek pomocou postupného pripočítavania konštanty:
       urobtu "dlzka 0
       opakuj :pocet [
         vetvicka :dlzka
         urobTu "dlzka :dlzka + :skratenie
       ]
  • náhodný počet vetvičiek pomocou prvkov zoznamu:
       urobtu "pocet ?prvok [5 6 7 8 9 10 11 12 13 14]

Zaujímavé obrázky výtvorov súťažiacich si môžete pozrieť v galérii prác k tejto úlohe.

Najčastejšie chyby a návrhy na vylepšenie:

  • chybné poradie operácií, zátvorky,
  • skracovanie dĺžky vetvičiek až do záporných hodnôt (pri niektorých hodnotách premenných to spôsobuje chybné vykresľovanie),
  • niektoré číselné hodnoty je výhodnejšie v riešeniach nahradzovať premennými (pre lepšiu čitateľnosť programu, možnosť ľahšie meniť vlastnosti programu a podobne).