One-dimensional cellular automata: Difference between revisions

Content added Content deleted
(→‎{{header|Perl 6}}: Update (GLR) and improve clarity)
Line 376: Line 376:
8: . . @ @ . . . . . . . . . . . . . . . .
8: . . @ @ . . . . . . . . . . . . . . . .
9: . . @ @ . . . . . . . . . . . . . . . .
9: . . @ @ . . . . . . . . . . . . . . . .

Another new solution (twice size as previous solution) :
#!/usr/local/bin/gawk -f

# User defined functions
function ASCII_to_Binary(str_) {
gsub("_","0",str_); gsub("@","1",str_)
return str_
}

function Binary_to_ASCII(bit_) {
gsub("0","_",bit_); gsub("1","@",bit_)
return bit_
}

function automate(b1,b2,b3) {
a = and(b1,b2,b3)
b = or(b1,b2,b3)
c = xor(b1,b2,b3)
d = a + b + c
return d == 1 ? 1 : 0
}

# For each line in input do
{
str_=$0
gen=0
taille=length(str_)
print "0: " str_
do {
gen ? str_previous=str_ : str_previous=""
gen=gen + 1
str_=ASCII_to_Binary(str_)
split(str_,tab,"")
str_=and(tab[1],tab[2])
for (i=1; i<=taille-2; i++) {
str_ = str_ automate(tab[i],tab[i+1],tab[i+2])
}
str_ = str_ and(tab[taille-1],tab[taille])
print gen ": " Binary_to_ASCII(str_)
} while (str_ != str_previous)
}

then :
$ echo ".@@@.@@.@.@.@.@..@.." | awk -f automata.awk
0: .@@@.@@.@.@.@.@..@..
1: _@_@@@@@_@_@_@______
2: __@@___@@_@_@_______
3: __@@___@@@_@________
4: __@@___@_@@_________
5: __@@____@@@_________
6: __@@____@_@_________
7: __@@_____@__________
8: __@@________________
9: __@@________________
</pre>
</pre>