Skip to content

Instantly share code, notes, and snippets.

@wojtekmach
Created September 12, 2012 11:59
Show Gist options
  • Select an option

  • Save wojtekmach/3706162 to your computer and use it in GitHub Desktop.

Select an option

Save wojtekmach/3706162 to your computer and use it in GitHub Desktop.
class Game
XN = 100
YN = 100
def initialize
@cells = {}
end
def add(x, y)
@cells["#{x}-#{y}"] = 1
end
def del(x, y)
@cells.delete("#{x}-#{y}")
end
def alive?(x, y)
@cells["#{x}-#{y}"] == 1
end
def dead?(x, y)
!alive?(x, y)
end
def neighbours(x, y)
count = 0
if alive?(x - 1, y - 1)
count += 1
end
if alive?(x - 1, y)
count += 1
end
if alive?(x - 1, y + 1)
count += 1
end
if alive?(x, y - 1)
count += 1
end
if alive?(x, y + 1)
count += 1
end
if alive?(x + 1, y - 1)
count += 1
end
if alive?(x + 1, y)
count += 1
end
if alive?(x + 1, y + 1)
count += 1
end
count
end
def run!
for_del = []
for_add = []
@cells.each do |coords, _|
x, y = coords.split('-').map(&:to_i)
if neighbours(x, y) < 2
for_del << [x, y]
end
if neighbours(x, y) > 3
for_del << [x, y]
end
end
XN.times do |x|
YN.times do |y|
for_add << [x, y] if dead?(x, y) && neighbours(x, y) == 3
end
end
for_del.each { |x, y| del(x, y) }
for_add.each { |x, y| add(x, y) }
end
end
describe Game do
let(:game) { Game.new }
specify '#alive?' do
game.add(0, 0)
game.alive?(0, 0).should be_true
game.alive?(0, 1).should be_false
end
specify '#del' do
game.add(0, 0)
game.del(0, 0)
game.alive?(0, 0).should be_false
end
specify '#neighbours' do
game.add(1, 1)
game.add(1, 2)
game.add(3, 3)
game.add(3, 4)
game.add(4, 4)
game.neighbours(1, 1).should == 1
game.neighbours(1, 2).should == 1
game.neighbours(3, 3).should == 2
end
describe '#run!' do
it 'cell dies when less than 2 neighbours' do
game.add(2, 2)
game.run!
game.alive?(2, 2).should be_false
end
it 'cell lives when 2 neighbours' do
game.add(2, 2)
game.add(2, 3)
game.add(3, 3)
game.run!
game.alive?(2, 2).should be_true
end
it 'cell lives when 3 neighbours' do
game.add(2, 2)
game.add(2, 3)
game.add(3, 3)
game.add(1, 1)
game.run!
game.alive?(2, 2).should be_true
end
it 'cell dies when more than 3 neighbours' do
game.add(2, 2)
game.add(2, 3)
game.add(3, 3)
game.add(1, 1)
game.add(1, 2)
game.run!
game.alive?(2, 2).should be_false
end
it 'cell is reviewed when 3 neighbours' do
game.add(2, 3)
game.add(3, 3)
game.add(1, 1)
game.run!
game.alive?(2, 2).should be_true
end
it 'cell is not reviewed when 4 neighbours' do
game.add(2, 3)
game.add(3, 3)
game.add(1, 1)
game.add(1, 2)
game.run!
game.alive?(2, 2).should be_false
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment