1次元オートマトン?

前に発見してから一度書いてみたいと思ってました。そして、今日時間があったので作ってみました。http://d.hatena.ne.jp/g7umz1cuwvsy/20071202/p1のサイトのコードを真似しました。(一部内容が変更されてたりします><)

これから

  • ルール30とかの意味を把握する
  • 画像で出力してみたい

コード

大きな変更

  • クラスを作った。
  • ルールを変更できるようにした。
    • (変更してはいけないのかもしれません。分からないです><)
#!/usr/bin/env ruby
$KCODE='utf8'

class A #良さそうなクラス名が思いつきませんでした
  def initialize rem = 30
    @rem = rem
    @cells = Array.new(rem,0)
    @cells[@cells.size/2] = 1
    @rule=[[0,0,0,0],[0,0,1,1],[0,1,0,1],[0,1,1,1],
           [1,0,0,1],[1,0,1,0],[1,1,0,0],[1,1,1,0]]
  end
  
  def start n=10
    n.times do 
      @cells.each{ |e| printf("%2s", (e==1)? "" : "")}
      puts
      @cells = step(@cells)
    end
  end
  
  def step next_
    #nextは予約語でした>< next -> next_
    next_ = []
    @cells.each_index do |i|
      que = []
      que << how_add(i-1){ |e| e > 0}
      que << @cells[i]
      que << how_add(i+1){ |e| e < @cells.size}
      @rule.each do |check|
        if que == check[0..-2] #-2で末尾よりひとつ前まで
          next_[i]=check.last 
          #check.last == check[-1] == check[3] (ここでは)
          break
        end
      end
    end
    next_
  end
  
  def how_add e
    yield(e) ? @cells[e] : 0
  end

  def edit_rule last_elements
    @rule.each_with_index do |e, i|
      e[-1] = last_elements[i]
    end
  end
end

5.times do
  x=A.new 30
  rules_last = (1..8).map{ (rand+0.5).to_i}
  x.edit_rule(rules_last)
  x.start 10
end