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