ライフゲーム

data = <<EOF
++++++++++++++++++++
++++++++++++++++++++
+++++++OOOOOO+++++++
++++++O++++++O++++++
+++++O++++++++O+++++
++++++O++++++O++++++
+++++++OOOOOO+++++++
++++++++++++++++++++
++++++++++++++++++++
EOF

LOOP = false
board = data.split(/\n/)
Y = board.size
X = board[0].size

def alive(board,y,x)
  return 0 if not LOOP and ( x<0 or x>=X or y<0 or y>=Y )
  board[y%Y][x%X] == "O" ? 1 : 0
end

def update(t0, t1)
  (0...Y).each do |i|
    (0...X).each do |j|
      life = alive(t0,i-1,j-1)+alive(t0,i-1,j)+alive(t0,i-1,j+1)+
             alive(t0,i  ,j-1)+                alive(t0,i  ,j+1)+
             alive(t0,i+1,j-1)+alive(t0,i+1,j)+alive(t0,i+1,j+1)
      t1[i][j] =
        case life
        when 2 then t0[i][j]
        when 3 then "O"
        else        "+"
        end
    end
  end
end

while gets == "\n"
  puts board
  next_board = Array.new(Y){"+"*X}
  update(board, next_board)
  board = next_board
end