セルオートマトン(2次元)

セルオートマトン
2次元のセルオートマトン

# ルール:
(1) cell[i,j]が0であり、かつ、周りの8つのセルに「1」の状態であるセルが2つある時に、cell[i,j]の次世代での状態は「1」となる
(2) cell[i,j]が1であり、かつ、周りの8つのセルに「1」の状態であるセルが1つか2つある時に、cell[i,j]の次世代での状態は「1」のままである
(3) (1)と(2)以外は全て「0」とする

解答例

par(mfrow=c(7,7)); par(mai=c(1/10,1/10,1/10,1/10));
nGen=48;nR=75;nC=75;
field=matrix(0,nR,nC);field[37:38,37:38]=1
image(field,xaxt='n',yaxt='n')
for (i_gen in 1:nGen){
  field2=cbind(field[,nC],field,field[,1])
  field3=rbind(field2[nR,],field2,field2[1,])
  field.temp=matrix(0,nrow=nR+2,ncol=nC+2);
  for (i_row in 2:(nR+1)){
    for (i_col in 2:(nC+1)){
      nOnes=sum(field3[i_row-1,(i_col-1):(i_col+1)])+
         (field3[i_row,i_col-1]+field3[i_row,i_col+1])+
         sum(field3[i_row+1,(i_col-1):(i_col+1)])
      if (nOnes==2) {
         field.temp[i_row,i_col]=1
      } 
    if (nOnes==1 & field3[i_row,i_col]==1) {
       field.temp[i_row,i_col]=1}
    }
  }
  field=field.temp[2:(nR+1),2:(nC+1)]
  image(field,xaxt='n',yaxt='n')
}

Leave a Reply