Autorské riešenie
[stiahni]

Riešenie úlohy vyžadovalo prácu s 2 korytnačkami - prvá korytnačka prehľadáva plochu s letokruhmi a druhá korytnačka prehľadáva plochu s vyrezanými značkami. Pri letokruhoch je smer prehľadávania pre prvú korytnačku ľubovoľný. Avšak značky sú vyrezávané vertikálnym smerom, preto druhej korytnačke je výhodnejšie pohybovať sa vertikálnym smerom.

Najprv sa teda pozrime na priečny rez kmeňa, v ktorom máme spočítať počet letokruhov. Korytnačka sa zo stredu môže vybrať ľubovoľným smerom, až kým nenarazí na čiernu kôru stromu.

kruhy

Počas tohto pohybu si bude pamätať, koľkokrát natrafila na hnedú farbu, čo bude zodpovedať výslednému počtu letokruhov. Je potrebné si ešte uvedomiť, že aj keď môžu mať letokruhy rôznu hrúbku, tak je potrebné ich počet započítať len raz a to tak, že ak sme prvýkrát narazili na hnedú farbu, pripočítame jednotku a postupujeme bez ďalšieho pripočítania ďalej, až kým hnedú farbu neopustíme.

Výsledná časť procedúry pre spočítanie počtu letokruhov môže vyzerať nasledovne:

   k1'domov
   k1'ph
   urobTu "pocetLetokruhov 0
   kym [k1'farbaBodu <> "cierna][
     ak k1'farbaBodu = "hneda [
       urobTu "pocetLetokruhov :pocetLetokruhov+1
       kym [k1'farbaBodu="hneda][k1'do 1]
     ]
     k1'do 1
   ]
   letokruhy'nechHodnota :pocetLetokruhov

Zisťovanie počtu vyrezaných značiek je trochu náročnejšie ako zisťovanie počtu letokruhov. Prehľadávať budeme vertikálnym smerom (po stĺpcoch), keďže všetky vyrezané značky sú takto orientované.

strom2

Na začiatku je korytnačka na hnedej čiare, a preto ju pomocou nasledujúcich príkazov presunieme na bielu plochu (prvý prehľadávaný stĺpec):

   k2'ph
   k2'vp 90
   kym [k2'farbaBodu="hneda][k2'do 1]
   k2'vl 90

Vieme, že výška plochy na obrazovke je 500 korytnačích krokov, šírku prehľadávanej plochy zadávať nemusíme, keďže opäť môžeme využiť testovanie farby bodu (až kým nenarazíme na hnedú farbu). V premennej pocetKrokov si budeme stále pamätať, či sme už prešli celý stĺpec. Príkazy môžu mať nasledovný tvar:

   urobTu "pocetZarezov 0
   kym[k2'farbaBodu<>"hneda][
     urobTu "pocetKrokov 0
     kym [:pocetKrokov<500] [
       urobTu "pocetKrokov :pocetKrokov+1
       k2'do 1 cakaj 0.1
       ak k2'farbaBodu="cierna [
         zvys "pocetZarezov
         kym [k2'farbaBodu="cierna][
           k2'do 1
           urobTu "pocetKrokov :pocetKrokov+1
         ]
       ]
     ]
     k2'vz 500
     k2'vp 90
     k2'do 1
     k2'vl 90
   ]
   zarezy'nechHodnota :pocetZarezov

Keď už máme vypočítané počty letokruhov a počty značiek, získané hodnoty porovnáme. Porovnanie môže vyzerať nasledovne:

   ak2 (:pocetLetokruhov=:pocetZarezov)
   [porovnanie'nechHodnota "ROVNAKO]
   [porovnanie'nechHodnota "ODLISNE]

Na záver už len bolo potrebné zdôvodniť, že tieto počty by sa mali stále rovnať. Jedinou výnimkou môže byť prípad, že lesník v niektorom roku značku vyrezať zabudol, prípadne, že nastala chyba hneď v prvom, prípadne v poslednom roku. Príčinou nerovnakého počtu letokruhov a značiek by mohla byť aj zaujímavá situácia, v ktorej lesník omylom vyreže značku tak, že sa bude prekrývať s nejakou ďalšou (už vyrezanou) značkou.

Vaše zaujímavé riešenia:

S úlohou ste si väčšinou veľmi úspešne poradili. Namiesto tradičného riešenia sa vyskytlo aj niekoľko zaujímavých postupov. Spočítanie letokruhov ste riešili aj tak, že postupne ste tieto letokruhy vymazávali pomocou vyplnenia bielou farbou. Postupné vymazávanie ste riešili takýmto spôsobom:

   k1'nechfv "biela
   ak k1'farbabodu = "hneda [k1'vypln urob "letokruhy (:letokruhy + 1)]

Tento postup ste používali rovnako aj pre spočítanie značiek (hneď ako natrafíme na značku, vyplníme značku bielou farbou). Takýmto spôsobom fungovalo prehľadanie celej plochy stromu aj horizontálnymi pohybmi, ako to je znázornené na nasledujúcom obrázku.

strom

Pri prehľadávaní ste radšej používali počet opakovaní s konkrétnym číslom ako testovanie na farbu bodu okraja. V tejto úlohe to však nespôsobovalo chybné riešenie.

Taktiež ste veľmi vhodne využívali príkaz odteraz "k1 a odteraz "k2, aby ste určili korytnačku, pre ktorú budú najbližšie príkazy určené.

Najčastejšie chyby:

  • chýbali komentáre k riešeniam,
  • prehľadali ste iba jednu z plôch,
  • chýbali záverečné zdôvodnenia (napríklad k tomu, čo sa stane, ak by vyrezal zárezy, ktoré sa prekrývajú).