Аксения обнови решението на 20.12.2011 21:51 (преди около 13 години)
+class GameOfLife
+ class Board
+ include Enumerable
+
+ attr_accessor :live_cells
+
+ def initialize(*cells)
+ @live_cells = cells.uniq
+ end
+
+ def[](x, y)
+ @live_cells.include?([x, y])? true : false
+ end
+
+ def each(&block)
+ @live_cells.each { |cell| yield cell }
+ end
+
+ def count
+ @live_cells.size
+ end
+
+ def to_a
+ @live_cells
+ end
+
+ def next_generation
+ survived = @live_cells.select { |x, y| live_neighbours_count(x, y) == 2 or
+ live_neighbours_count(x, y) == 3 }
+ reborn = possible_reborn_cells.select { |x, y| live_neighbours_count(x, y) == 3 }
+
+ Board.new *(survived + reborn)
+ end
+
+ def neighbours(x, y)
+ [[x - 1, y + 1], [x, y + 1], [x + 1, y + 1],
+ [x - 1, y], [x + 1, y],
+ [x - 1, y - 1], [x , y - 1], [x + 1, y - 1]]
+ end
+
+ def live_neighbours_count(x, y)
+ neighbours(x, y).map { |x, y| self[x, y] }.select { |element| element == true }.size
+ end
+
+ def possible_reborn_cells
+ cells = []
+ @live_cells.each { |x, y| cells += neighbours(x, y) }
+ cells.uniq - @live_cells
+ end
+ end
+end
- Ако не ти трябва за нещо параметърът
block
, го махни от дефиницията на функцията, по-бързо ще е:def each(&block)
- Получаваш
count
иto_a
наготово - Подредбата на кода в
next_generation
май може да се подобри малко
Иначе, като цяло, решението изглежда добре.