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