Código em C: Autômatos celulares unidimensionais

O código a seguir escreve na tela, com 0s e 1s, um autômato celular de 1 dimensão. Basicamente, cria-se um vetor inicial repleto de 0s, exceto pela posição do meio, que possui o valor 1. Por exemplo, para um vetor de 9 posições, temos:

0 0 0 0 1 0 0 0 0

A ideia é criar linhas novas a partir das linhas anteriores e a partir de regras pré-definidas. Chamemos a linha atual de L_atu, e a linha anterior, L_ant. Cada posição n de L_atu é dada da seguinte forma:

L_atu(n) = F( L_ant(n-1), L_ant(n), L_ant(n+1) ),

onde F( ) é uma função pré-definida. Por exemplo, podemos ter:

F(0, 0, 0) = 0
F(0, 0, 1) = 1
F(0, 1, 0) = 1
F(0, 1, 1) = 1
F(1, 0, 0) = 1
F(1, 0, 1) = 0
F(1, 1, 0) = 0
F(1, 1, 1) = 0

Repare que F( ) tem 3 entradas, que só recebem os valores 0 e 1. Assim, F( ) sempre possui 8 valores definidos de saída (2^3 valores). Além disso, as saídas de F( ) também só podem ser 0 ou 1. Temos então 2^8 = 256 funções F( ) possíveis.

A função mostrada acima é chamada de regra 30, pelo seguinte motivo: considerando que os valores de saída formam um número de 8 bits, então esta regra representa o número

0*(2^0) + 1*(2^1) + 1*(2^2) + 1*(2^3) + 1*(2^4) + 0*(2^5) + 0*(2^6) + 0*(2^7) = 2+4+8+16 = 30.

O video abaixo demonstra o processo de construção de um autômato celular com a regra 45.



O código a seguir gera um autômato celular, pergunta ao usuário qual a regra a ser seguida, o tamanho das linhas, e o número total de linhas.