ruby-life 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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=
@@ -0,0 +1,2 @@
1
+ TODO.md
2
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -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
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')
@@ -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
+
@@ -0,0 +1,3 @@
1
+ module RubyLife
2
+ VERSION = "0.0.2"
3
+ end
@@ -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
@@ -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: []