Skip to content

Instantly share code, notes, and snippets.

@netmute
Last active October 27, 2022 13:22
Show Gist options
  • Star 66 You must be signed in to star a gist
  • Fork 16 You must be signed in to fork a gist
  • Save netmute/1761463 to your computer and use it in GitHub Desktop.
Save netmute/1761463 to your computer and use it in GitHub Desktop.
Game of Life

Game of Life

An implementation of Conway's Game of Life in 140 characters of Ruby.

Author

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
@coreyward
Copy link

Here's an even shorter version:

require 'open-uri'
eval open('http://bit.ly/16brOlw').read

👅

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment