ruby-life 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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: []