# Small rewrite of the original code to support independent x and y values. # Doesn't fit in 140 chars anymore, though. # life = lambda do |grid, x, y| (0..x*y-1).map do |i| lambda do |neighbours| neighbours == 3 || ( grid[i] && neighbours == 2 )|| nil end.call ( [ grid[i-x-1], grid[i-x], grid[i-x+1], grid[i-1], grid[i+1], grid[i+x-1], grid[i+x], grid[i+x+1] ].compact.count ) end end x = 80 y = 20 grid = (1..x*y).map { rand(0..1)==1 ? 1 : nil } while true do system 'clear' grid = life[grid, x, y] (0..y-1).each do |yi| (0..x-1).each do |xi| print "#{(grid[xi+(yi*x)] ? 'O' : '.')}" end puts end sleep 0.1 end