ruby-life 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +2 -0
- data/Gemfile +3 -0
- data/README.md +17 -0
- data/Rakefile +0 -0
- data/examples/blinker.json +1 -0
- data/examples/blinker.save.json +1 -0
- data/examples/glider.json +1 -0
- data/examples/glider.save.json +1 -0
- data/lib/generate_game.rb +30 -0
- data/lib/ruby-life.rb +148 -0
- data/lib/ruby-life/version.rb +3 -0
- data/lib/run.rb +29 -0
- data/ruby-life.gemspec +18 -0
- metadata +57 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZTlhZWQwMDZiZTY0MTFhODU0YWU0OGRjNDI2ZmJlYzI0NmMyMzU4ZA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
Y2MyMWNmNzIxYzFlN2Y1NzUzYTA4NzAyYTE4NDJiMDRjYzA3MjIwMQ==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ODEyNDIyZjRjOWY4Y2QyOGY4NjY4NDBkNTFiMWUzNDYwNDRmMTYyNTRiYzdk
|
10
|
+
ZTUxZjFiOTMwY2YwZWYzNGJkMjg2NDlhZjQ1YWJiZDNjYTczZjdlZWViMDlj
|
11
|
+
MTUxZjIyNTkzZmVhODlmODhiYTExMTAyYjdjN2U4MTNlZWNlZjU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NWU4MTIxNDZjODlhYzUzNmYzMTNmNGRhZDgzOGFhNzMxOGQwZjcwYTk1Mzdm
|
14
|
+
N2I2YTQzMTZkNWI4YjY1ZDZlNGFhNDllYzM5ODJlM2M1MTJjYzFiYWJjNzM2
|
15
|
+
OTBlZjEyYjhkNGJiZGViNTBhNDhjNGI4ZTU2MjA3MTYyM2U4YTQ=
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# Conway's Game of Life, in Ruby
|
2
|
+
|
3
|
+
### Usage
|
4
|
+
gem install ruby-life
|
5
|
+
ruby run.rb $INPUT_FILE
|
6
|
+
|
7
|
+
where `run.rb` is an example game in `lib/` and `$INPUT_FILE` is a JSON file with a group of rows.
|
8
|
+
Each row is an array of strings {'dead', 'alive'} that is used to
|
9
|
+
populate the program's representation of the game.
|
10
|
+
|
11
|
+
For more information on the game itself, see here:
|
12
|
+
[http://en.wikipedia.org/wiki/Conway's_Game_of_Life](http://en.wikipedia.org/wiki/Conway's_Game_of_Life)
|
13
|
+
|
14
|
+
Written with inspiration from [http://rubyquiz.strd6.com/quizzes/193-game-of-life](http://rubyquiz.strd6.com/quizzes/193-game-of-life)
|
15
|
+
|
16
|
+
### Questions, comments?
|
17
|
+
@ralexstokes on Twitter
|
data/Rakefile
ADDED
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
{"row_1":["dead","dead","dead","dead","dead"],"row_2":["dead","dead","dead","dead","dead"],"row_3":["dead","alive","alive","alive","dead"],"row_4":["dead","dead","dead","dead","dead"],"row_5":["dead","dead","dead","dead","dead"]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"row_1":["dead","dead","dead","dead","dead"],"row_2":["dead","dead","dead","dead","dead"],"row_3":["dead","alive","alive","alive","dead"],"row_4":["dead","dead","dead","dead","dead"],"row_5":["dead","dead","dead","dead","dead"]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"row_1":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_2":["dead","dead","dead","alive","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_3":["dead","dead","dead","dead","alive","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_4":["dead","dead","alive","alive","alive","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_5":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_6":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_7":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_8":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_9":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_10":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_11":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_12":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_13":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_14":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_15":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_16":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_17":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_18":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_19":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_20":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_21":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_22":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_23":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_24":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_25":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_26":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_27":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_28":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_29":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_30":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_31":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_32":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_33":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_34":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_35":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"row_1":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_2":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_3":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_4":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_5":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_6":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_7":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_8":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_9":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_10":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_11":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_12":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_13":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_14":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_15":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_16":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_17":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_18":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_19":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_20":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_21":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_22":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_23":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_24":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_25":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_26":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_27":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","alive","dead","dead","dead","dead","dead","dead"],"row_28":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","alive","dead","dead","dead","dead","dead"],"row_29":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","alive","alive","alive","dead","dead","dead","dead","dead"],"row_30":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_31":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_32":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_33":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_34":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"],"row_35":["dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead","dead"]}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'ruby-life'
|
2
|
+
|
3
|
+
class GridBuilder
|
4
|
+
attr_reader :grid_size, :state
|
5
|
+
def initialize(grid_size, initial_state = [])
|
6
|
+
@grid_size = grid_size
|
7
|
+
@state = initial_state
|
8
|
+
end
|
9
|
+
|
10
|
+
def create_grid
|
11
|
+
grid_size.times do
|
12
|
+
state << []
|
13
|
+
end
|
14
|
+
|
15
|
+
state.each do |row|
|
16
|
+
grid_size.times { row << Cell.new }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
puts "\n\tLet's make a seed configuration for #{MODULE_NAME}"
|
22
|
+
puts "\tEnter size of (square) grid."
|
23
|
+
|
24
|
+
size = gets.to_i
|
25
|
+
gm = GridBuilder.new size
|
26
|
+
|
27
|
+
gm.create_grid
|
28
|
+
initial_grid = Grid.new(nil, gm.state)
|
29
|
+
initial_grid.pad_boundaries!
|
30
|
+
initial_grid.save('../examples/random.json')
|
data/lib/ruby-life.rb
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
MODULE_NAME = 'ruby-life'
|
4
|
+
|
5
|
+
class Cell
|
6
|
+
attr_accessor :alive, :neighbors
|
7
|
+
alias :alive? :alive
|
8
|
+
|
9
|
+
def initialize(status = nil, seed_probability = 0.5)
|
10
|
+
case status
|
11
|
+
when 'alive'
|
12
|
+
@alive = true
|
13
|
+
when 'dead'
|
14
|
+
@alive = false
|
15
|
+
else
|
16
|
+
@alive = seed_probability > rand
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def update
|
21
|
+
if alive?
|
22
|
+
self.alive = false if neighbors < 2 || neighbors > 3
|
23
|
+
else
|
24
|
+
self.alive = true if neighbors == 3
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_i
|
29
|
+
alive? ? 1 : 0
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_s
|
33
|
+
alive? ? 'O' : '-'
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_sym
|
37
|
+
alive? ? :alive : :dead
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class Grid
|
42
|
+
attr_accessor :state, :grid_size
|
43
|
+
|
44
|
+
def initialize(input_file = nil, input_state = [])
|
45
|
+
@state = input_state
|
46
|
+
load input_file if input_file
|
47
|
+
@grid_size = state.size
|
48
|
+
end
|
49
|
+
|
50
|
+
def load(input_file)
|
51
|
+
input_hash = File.open(input_file) do |f|
|
52
|
+
input_json = f.read
|
53
|
+
JSON.parse input_json
|
54
|
+
end
|
55
|
+
make_cells input_hash
|
56
|
+
end
|
57
|
+
|
58
|
+
def save(output_file)
|
59
|
+
output_hash = {}
|
60
|
+
state.each.with_index(1) do |row, index|
|
61
|
+
output_hash["row_#{index}"] = row.map do |cell|
|
62
|
+
cell.to_sym
|
63
|
+
end
|
64
|
+
end
|
65
|
+
File.open(output_file, 'w') do |f|
|
66
|
+
f.write output_hash.to_json
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def make_cells(input_hash)
|
71
|
+
input_hash.each do |col, row|
|
72
|
+
state << row.map { |cell| Cell.new cell }
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def pad_boundaries!
|
77
|
+
state.map do |row|
|
78
|
+
row.unshift Cell.new('dead')
|
79
|
+
row.push Cell.new('dead')
|
80
|
+
self.grid_size = row.size
|
81
|
+
end
|
82
|
+
self.state = state.unshift dead_row
|
83
|
+
self.state = state.push dead_row
|
84
|
+
end
|
85
|
+
|
86
|
+
def dead_row
|
87
|
+
Array.new(grid_size) { Cell.new('dead') }
|
88
|
+
end
|
89
|
+
|
90
|
+
def next(timestep)
|
91
|
+
timestep.times do
|
92
|
+
state.each.with_index do |row, i|
|
93
|
+
row.each.with_index do |cell, j|
|
94
|
+
cell.neighbors = find_neighbors i, j
|
95
|
+
end
|
96
|
+
end
|
97
|
+
state.flatten.each { |cell| cell.update }
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def find_neighbors(i, j)
|
102
|
+
neighbors = index_array.map do |k,l|
|
103
|
+
k_index, l_index = modular_indices (i+k), (j+l)
|
104
|
+
state[k_index][l_index]
|
105
|
+
end
|
106
|
+
neighbors.flatten.map(&:to_i).inject(:+)
|
107
|
+
end
|
108
|
+
|
109
|
+
def index_array
|
110
|
+
[
|
111
|
+
[-1,-1], [-1,0], [-1, 1], # cells above self
|
112
|
+
[0, -1], [0, 1], # cells left and right of self
|
113
|
+
[1, -1], [1, 0], [1,1] # cells below self
|
114
|
+
]
|
115
|
+
end
|
116
|
+
|
117
|
+
def modular_indices(i, j)
|
118
|
+
[i, j].map { |index| index % grid_size }
|
119
|
+
end
|
120
|
+
|
121
|
+
def display
|
122
|
+
state.each { |row| puts row.join cell_separator }
|
123
|
+
puts
|
124
|
+
end
|
125
|
+
|
126
|
+
def cell_separator
|
127
|
+
' '
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
class GameOfLife
|
132
|
+
attr_accessor :grid, :time, :timestep
|
133
|
+
|
134
|
+
def initialize(grid, initial_time = 0, timestep = 1)
|
135
|
+
@grid = grid
|
136
|
+
@time = initial_time
|
137
|
+
@timestep = timestep
|
138
|
+
end
|
139
|
+
|
140
|
+
def advance
|
141
|
+
puts "Time: #{time}", "-" * 10
|
142
|
+
self.time += timestep
|
143
|
+
|
144
|
+
grid.display
|
145
|
+
grid.next timestep
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
data/lib/run.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'ruby-life'
|
2
|
+
|
3
|
+
SEED_FILE = ARGV[0]
|
4
|
+
|
5
|
+
unless SEED_FILE
|
6
|
+
puts "\n\tWelcome to #{MODULE_NAME}!"
|
7
|
+
puts "\tUsage: `ruby run.rb $INPUT_FILE`"
|
8
|
+
puts "\t=> Generate a seed configuration $INPUT_FILE with `ruby lib/generate_game.rb`"
|
9
|
+
puts "\t=> Example seed files are in ./examples/"
|
10
|
+
exit
|
11
|
+
end
|
12
|
+
|
13
|
+
def save_slug
|
14
|
+
ARGV[0].split('/')[1].split('.')[0]
|
15
|
+
end
|
16
|
+
|
17
|
+
grid = Grid.new SEED_FILE
|
18
|
+
# grid.pad_boundaries!
|
19
|
+
game = GameOfLife.new grid
|
20
|
+
|
21
|
+
system 'clear'
|
22
|
+
100.times do
|
23
|
+
game.advance
|
24
|
+
sleep 0.1
|
25
|
+
system 'clear'
|
26
|
+
end
|
27
|
+
|
28
|
+
SAVE_FILE = "./#{ARGV[0].split('/')[0]}/#{save_slug}.save.json"
|
29
|
+
grid.save SAVE_FILE
|
data/ruby-life.gemspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path "../lib", __FILE__
|
3
|
+
require "ruby-life/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "ruby-life"
|
7
|
+
s.version = RubyLife::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.author = ["R Alex Stokes"]
|
10
|
+
s.email = [""]
|
11
|
+
s.homepage = "http://alex.stokes.io"
|
12
|
+
s.summary = "Conway's Game of Life, in Ruby"
|
13
|
+
s.description = "http://en.wikipedia.org/wiki/Conway's_Game_of_Life, with faster sleep time"
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {spec}/*`.split("\n")
|
17
|
+
s.require_paths = ['lib']
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby-life
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- R Alex Stokes
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-01-12 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: http://en.wikipedia.org/wiki/Conway's_Game_of_Life, with faster sleep
|
14
|
+
time
|
15
|
+
email:
|
16
|
+
- ''
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- .gitignore
|
22
|
+
- Gemfile
|
23
|
+
- README.md
|
24
|
+
- Rakefile
|
25
|
+
- examples/blinker.json
|
26
|
+
- examples/blinker.save.json
|
27
|
+
- examples/glider.json
|
28
|
+
- examples/glider.save.json
|
29
|
+
- lib/generate_game.rb
|
30
|
+
- lib/ruby-life.rb
|
31
|
+
- lib/ruby-life/version.rb
|
32
|
+
- lib/run.rb
|
33
|
+
- ruby-life.gemspec
|
34
|
+
homepage: http://alex.stokes.io
|
35
|
+
licenses: []
|
36
|
+
metadata: {}
|
37
|
+
post_install_message:
|
38
|
+
rdoc_options: []
|
39
|
+
require_paths:
|
40
|
+
- lib
|
41
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ! '>='
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
requirements: []
|
52
|
+
rubyforge_project:
|
53
|
+
rubygems_version: 2.1.10
|
54
|
+
signing_key:
|
55
|
+
specification_version: 4
|
56
|
+
summary: Conway's Game of Life, in Ruby
|
57
|
+
test_files: []
|