elementary_cellular_automaton_regex.sf 546 B

123456789101112131415161718192021
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Elementary_cellular_automaton/Infinite_length
  4. #
  5. func evolve(rule, bin) {
  6. var offset = 0
  7. var (l='', r='')
  8. 20.times {
  9. bin.sub!(/^((.)\g2*)/, {|_s1, s2| l = s2; offset -= s2.len; s2*2 })
  10. bin.sub!(/(.)\g1*$/, {|s1| r = s1; s1*2 })
  11. printf("%5d| %s%s\n", offset, ' ' * (40 + offset), bin.tr('01','.#'))
  12. bin = [l*3, 0.to(bin.len-3).map{|i| bin.substr(i, 3) }..., r*3 ].map { |t|
  13. 1 & (rule >> t.bin)
  14. }.join
  15. }
  16. }
  17. evolve(90, "010")