Zad. 1 (19 XI 2003) (za 4 punkty)

Automat komórkowy jest symulowanym światem wypełnionym komórkami
zmieniającymi swój stan w zależności od bodźców zewnętrznych,
np. stanu swoich sąsiadów. Przykładem automatu komórkowego jest
tzw. "Gra w Zycie" Conwaya.

My zajmiemy się symulacją automatu komórkowego w jednowymiarowym,
cyklicznym świecie o ustalonym rozmiarze.

Każda komórka może być w jednym z dwóch stanów: żywym lub martwym.
Symulacja polega na ustaleniu, na podstawie aktualnego stanu świata,
nowego stanu wszystkich komórek. Powiemy, że jeden krok symulacji
oblicza nową generację w oparciu o poprzednią.

Reguła określająca nowy stan komórki będzie uwzględniała jej
dotychczasowy stan, oraz stan jej bezpośrednich sąsiadów.
Oto kilka przykładowych reguł:

(a) w następnej generacji żywe komórki giną a martwe stają się żywe
(b) świat przesuwa się "w prawo", tj. komórka osiąga stan, jaki poprzednio
    miał jej lewy sąsiad
(c) świat przesuwa się "w lewo", tj. komórka osiąga stan, jaki
    poprzednio miał jej prawy sąsiad
(d) żyją komórki, które w poprzedniej generacji miały dokładnie
    jednego żywego sąsiada, pozostałe stają się martwe

Do zapisu reguły rządzącej symulowanym światem potrzebne jest 8 bitów
informacji. Będziemy ją reprezentowali jako liczbę całkowitą z
przedziału 0..255. Kolejne cyfry w zapisie binarnym tej liczby
określą, na podstawie stanu trzech sąsiadujących komórek, nowy stan
środkowej z nich.

Oto reprezentacja przedstawionych powyżej reguł
("1" oznacza komórkę żywą a "0" martwą):

    111  110  101  100  011  010  001  000  reprezentacja liczbowa
(a)  0    0    1    1    0    0    1    1             51
(b)  1    1    1    1    0    0    0    0            240
(c)  1    0    1    0    1    0    1    0            170
(d)  0    1    0    1    1    0    1    0             90

Napisz program, który przeprowadzi symulację automatu komórkowego
opisanego powyżej.

Program powinien pobrać dwa parametry. Pierwszy z nich ma być liczbą
0..255 reprezentującą regułę obliczania nowej generacji, a drugi
to liczba (>0) kroków symulacji, które należy wykonać.

Program wczyta z wejścia stan początkowy świata zapisany jako ciąg
znaków 'X' (komórka żywa) oraz ' ' (komórka martwa) i zasymuluje
działanie automatu komórkowego wypisując na wyjście stan świata p=
o
obliczeniu każdej nowej generacji.

Oto przykład działania programu (rozmiar świata równy 50):

dla stanu początkowego:

XX X   XXXX  X X  X X X X XXXXX X    X X  X  X  XX

program wywołany z parametrami 90 10 powinien wypisać:

 X  X XX  XXX   XX        X   X  X  X   XX XX XXX
X XX  XXXXX XX XXXX      X X X XX XX X XXX XX X XX
X XXXXX   X XX X  XX    X      XX XX   X X XX   X
  X   XX X  XX  XXXXX  X X    XXX XXX X    XXX X
 X X XXX  XXXXXXX   XXX   X  XX X X X  X  XX X  X
X    X XXXX     XX XX XX X XXXX      XX XXXX  XX X
XX  X  X  XX   XXX XX XX   X  XX    XXX X  XXXXX X
 XXX XX XXXXX XX X XX XXX X XXXXX  XX X  XXX   X X
 X X XX X   X XX   XX X X   X   XXXXX  XXX XX X
X    XX  X X  XXX XXX    X X X XX   XXXX X XX  X

Uwaga 1:
Program powinien badać poprawność swoich parametrów.

Uwaga 2:
Rozmiar świata należy określić przy pomocy stałej symbolicznej, by
łatwo można było go zmienić.

Uwaga 3:
Regułę określającą zachowanie automatu wygodnie jest reprezentować
podczas symulacji jako tablicę trójwymiarową.

Uwaga 4:
Do odczytywania parametrów programu użyj funkcji "paramCount" i
"paramStr" oraz procedury "val" (opis na zajęciach).