An implementation of Conway's Game of Life in 140 characters of Ruby.
Created by Simon Ernst (@sier).
Thanks to @aemkei for feedback and inspiration!
An implementation of Conway's Game of Life in 140 characters of Ruby.
Created by Simon Ernst (@sier).
Thanks to @aemkei for feedback and inspiration!
| life=->g,s{(0..s*s-1).map{|i|->n{n==3||(g[i]&&n==2)||nil}[[g[i-s-1],g[i-s],g[i-s+1],g[i-1],g[i+1],g[i+s-1],g[i+s],g[i+s+1]].compact.count]}} |
| # The code with some animation logic for demonstration. | |
| # | |
| life=->g,s{(0..s*s-1).map{|i|->n{n==3||(g[i]&&n==2)||nil}[[g[i-s-1],g[i-s],g[i-s+1],g[i-1],g[i+1],g[i+s-1],g[i+s],g[i+s+1]].compact.count]}} | |
| size = 20 | |
| grid = (1..size*size).map { rand(0..1)==1 ? 1 : nil } | |
| while true do | |
| system 'clear' | |
| grid = life[grid, size] | |
| (0..size-1).each do |y| | |
| (0..size-1).each do |x| | |
| print "#{(grid[x+(y*size)] ? 'O' : '.')}" | |
| end | |
| puts | |
| end | |
| sleep 0.1 | |
| end |
| # Expanded version for better readability. | |
| # | |
| life = lambda do |grid, size| | |
| (0..size*size-1).map do |i| | |
| lambda do |neighbours| | |
| neighbours == 3 || ( grid[i] && neighbours == 2 )|| nil | |
| end.call ( | |
| [ | |
| grid[i-size-1], grid[i-size], grid[i-size+1], | |
| grid[i-1], grid[i+1], | |
| grid[i+size-1], grid[i+size], grid[i+size+1] | |
| ].compact.count | |
| ) | |
| end | |
| end |
| # 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 |
Interesting, but the expanded version gives an error:
`rand': can't convert Range into Integer (TypeError)
rand(a..b) does not work by default in 1.8. you should use 1.9 or replace rand(range) call with Random.new.rand(range)
@Neurogami Directly passing ranges to rand only works in Ruby 1.9.3.
Try Random.new.rand instead.
Ah, thanks. I had tried it 1.9.2
I put together a cute little Perl version: https://gist.github.com/1803656
Reminds me of an experiment I made years ago, world:
$ git clone https://github.com/Roman2K/_world world
$ cd world
$ ruby lib/world.rbMy attempt, in JavaScript: 130 bytes
http://xem.github.io/miniGameOfLife
Here's an even shorter version:
require 'open-uri'
eval open('http://bit.ly/16brOlw').read
👅
Just for the sake of completeness, here is Conway's Game of Life in 140byt.es JavaScript.