Autorské riešenie
[stiahni]

Úlohu budeme riešiť pomocou zoznamov. V jednom zozname máme zachytenú momentálnu situáciu zo života kolónie korybaktérií. Číslom 1 zakódujeme živú korybaktériu, číslom 0 neživú. Napr. situáciu na obrázku môžme zachytiť zoznamom [0 1 1 0 0 1 1 0 1 0 1 1] podľa pravidla otáčania sa hodinovej ručičky.

bakterie

Postupne budeme prechádzať týmto zoznamom. Pre každé políčko určíme jeho ľavého a pravého suseda. Podľa jeho stavu a stavu jeho dvoch susedov vypočítame jeho stav o hodinu. Zapíšeme ho do nového zoznamu. Pri určovaní susedov ľavého a pravého krajného políčka si musíme dať pozor. Susedmi políčka 1 sú políčka 12 a 2. Susedmi políčka 12 sú políčka 11 a 1. Vo všeobecnosti susedov políčka 1 vypočítame podľa:

ak pocitadlo=1
 [urobTu "lavy :kolko
  urobTu "stred 1
  urobTu "pravy 2]

a susedov krajného pravého políčka vypočítame podľa:

ak pocitadlo=:kolko
 [urobTu "lavy :kolko - 1
  urobTu "stred :kolko
  urobTu "pravy 1]]

Vypočet stavu prazdného políčka po hodine urobíme podľa podmienky:

ak2 zaroven prvok :lavy :z = 1 prvok :pravy :z = 1
  [urobTu "d vlozPo 1 :d]
  [urobTu "d vlozPo 0 :d]

Vidíme, že nová korybaktéria sa narodí len vtedy, ak sú susedné políčka obsadené.

Výpočet stavu živého políčka po hodine urobíme podľa podmienky:

ak2 prvok :lavy :z <> prvok :pravy :z
  [urobTu "d vlozPo 1 :d]
  [urobTu "d vlozPo 0 :d]

V prípade, že korybaktéria na políčku nemá žiadného suseda, umiera na samotu. Ak má dvoch susedov umiera na nedostatok živín. Korybaktéria prežíva, ak má na susednom políčku práve jedného suseda.

Výsledný príkaz zobraz vyzerá nasledovne:

viem zobraz :z
  urobTu "d []
  urobTu "kolko pocet :z

  ;opakuj nastavenia hodnot novej generacie D z generacie Z
  opakuj :kolko
    [
     ;nastavenie pozicii susednych policok - lavy, stred, pravy
     ak2 zaroven pocitadlo<>1 pocitadlo<>:kolko
       [urobTu "lavy pocitadlo - 1
        urobTu "stred pocitadlo
        urobTu "pravy pocitadlo + 1]
       [ak pocitadlo=1
          [urobTu "lavy :kolko
           urobTu "stred 1
           urobTu "pravy 2]
        ak pocitadlo=:kolko
          [urobTu "lavy :kolko - 1
           urobTu "stred :kolko
           urobTu "pravy 1]]

     ;zmena hodnoty stredneho policka na zaklade susednych policok a zapis do generacie D
     ak2 prvok :stred :z =0
       [ak2 zaroven prvok :lavy :z = 1 prvok :pravy :z = 1
          [urobTu "d vlozPo 1 :d]
          [urobTu "d vlozPo 0 :d]]
       [ak2 prvok :lavy :z <> prvok :pravy :z
          [urobTu "d vlozPo 1 :d]
          [urobTu "d vlozPo 0 :d]]]

  ;ulozenie novych hodnot generacie Z z vypocitanych hodnot generacie D
  urobTu "z :d
  pis :z
koniec

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

Najčastejšie nedostatky, ktorých ste sa dopustili vo svojich riešeniach:

  • niektoré riešenia boli nesprávne vďaka nedomyslenej úvahe a neprehľadnosti zápisu (nezarovnané a štyrikrát vnorené príkazy AK2),
  • používate väčšinou globálne premenné, čo vás nenútilo v procedúre použiť parametre programu,
  • niektorí ste pracovali s presne 12 prvkovým zoznamom, ini vedeli vyriešiť úlohu s ľubovoľne dlhým zoznamom,
  • pozor pri niektorých príkazoch, ktoré skracujú pôvodný zoznam (napr. bezpr) a umožňujú elegantné vyriešenie problému. Tieto neumožňujú na konci riešenia opätovné vypísanie prvkov pôvodného zoznamu.