One-dimensional cellular automata: Difference between revisions

mNo edit summary
Line 3,898:
drop x2
endfor</lang>
 
=={{header|Picat}}==
<lang Picat>go =>
% _ # # # _ # # _ # _ # _ # _ # _ _ # _ _
S = [0,1,1,1,0,1,1,0,1,0,1,0,1,0,1,0,0,1,0,0],
println(init=S),
run_ca(S),
nl,
 
println("Some random inits:"),
_ = random2(),
foreach(N in [5,10,20,50])
S2 = [random() mod 2 : _I in 1..N],
run_ca(S2),
nl
end.
 
%
% Run a CA and show the result.
%
 
% rule/1 is the default
run_ca(S) =>
run_ca(S,rule).
run_ca(S,Rules) =>
Len = S.length,
All := [S],
Seen = new_map(), % detect fixpoint and cycle
while (not Seen.has_key(S))
Seen.put(S,1),
T = [S[1]] ++ [apply(Rules, slice(S,I-1,I+1)) : I in 2..Len-1] ++ [S[Len]],
All := All ++ [T],
S := T
end,
foreach(A in All) println(A.convert()) end,
writeln(len=All.length).
 
% Convert:
% 0->"_"
% 1->"#"
convert(L) = Res =>
B = "_#",
Res = [B[L[I]+1] : I in 1..L.length].
 
% the rules
rule([0,0,0]) = 0. %
rule([0,0,1]) = 0. %
rule([0,1,0]) = 0. % Dies without enough neighbours
rule([0,1,1]) = 1. % Needs one neighbour to survive
rule([1,0,0]) = 0. %
rule([1,0,1]) = 1. % Two neighbours giving birth
rule([1,1,0]) = 1. % Needs one neighbour to survive
rule([1,1,1]) = 0. % Starved to death.</lang>
 
{{out}}
<pre>init = [0,1,1,1,0,1,1,0,1,0,1,0,1,0,1,0,0,1,0,0]
_###_##_#_#_#_#__#__
_#_#####_#_#_#______
__##___##_#_#_______
__##___###_#________
__##___#_##_________
__##____###_________
__##____#_#_________
__##_____#__________
__##________________
__##________________
len = 10
 
Some random inits:
_###_
_#_#_
__#__
_____
_____
len = 5
 
_#___##_#_
_____###__
_____#_#__
______#___
__________
__________
len = 6
 
###__####_#___#___##
#_#__#__##________##
##______##________##
##______##________##
len = 4
 
______###_#_#___####__#_______#__#___#_####__#_###
______#_##_#____#__#__________________##__#___##_#
_______####___________________________##______####
_______#__#___________________________##______#__#
______________________________________##_________#
______________________________________##_________#
len = 6</pre>
 
 
The program is fairly general. Here's the additional code for the rule 30 CA.
<lang Picat>go2 =>
N = 4,
Ns = [0 : _ in 1..N],
S = Ns ++ [1] ++ Ns,
run_ca(S, rule30).
 
% The rules for rule 30
rule30([0,0,0]) = 0.
rule30([0,0,1]) = 1.
rule30([0,1,0]) = 1.
rule30([0,1,1]) = 1.
rule30([1,0,0]) = 1.
rule30([1,0,1]) = 0.
rule30([1,1,0]) = 0.
rule30([1,1,1]) = 0.</lang>
 
=={{header|PicoLisp}}==
495

edits