One-dimensional cellular automata: Difference between revisions

Content added Content deleted
m (Added the Sidef language)
Line 3,552: Line 3,552:
__##________________
__##________________
__##________________
__##________________
</pre>

=={{header|Sidef}}==
{{trans|Perl}}
<lang ruby>var seq = "_###_##_#_#_#_#__#__";
var x = '';

loop {
seq.tr!('01', '_#');
say seq;
seq.tr!('_#', '01');
seq.gsub!(/(?<=(.))(.)(?=(.))/, {|s1,s2,s3| s1 == s3 ? (s1 ? 1-s2 : 0) : s2});
(x != seq) && (x = seq) || break;
};</lang>

{{out}}
<pre>
_###_##_#_#_#_#__#__
_#_#####_#_#_#______
__##___##_#_#_______
__##___###_#________
__##___#_##_________
__##____###_________
__##____#_#_________
__##_____#__________
__##________________
</pre>

{{trans|Perl 6}}
<lang ruby>class Automaton(rule, cells) {

method new {
rule = sprintf("%08b", rule).split(1).map{.to_i}.reverse;
}

method next {
var previous = cells.map{_};
var len = previous.len;
cells = rule[
previous.range.map { |i|
4*previous[i-1 % len] +
2*previous[i] +
previous[i+1 % len]
}
];
}

method to_s {
cells.map { _ ? '#' : ' ' }.join('');
}
}

var size = 10;
var auto = Automaton(
rule: 104,
cells: [(size/2).of(0)..., '111011010101'.chars..., (size/2).of(0)...],
);

size.times {
say "|#{auto}|";
auto.next;
};</lang>

{{out}}
<pre>
| ### ## # # # |
| # ##### # # |
| ## ## # |
| ## ### |
| ## # # |
| ## # |
| ## |
| ## |
| ## |
| ## |
</pre>
</pre>