Мартин обнови решението на 14.12.2011 23:10 (преди около 13 години)
+module GameOfLife
+ def self.neighbours(x, y)
+ [[x-1, y-1], [x-1, y], [x-1, y+1], [x, y+1], [x+1, y+1], [x+1, y], [x+1, y-1], [x, y-1]]
+ end
+
+ class Board
+ include Enumerable
+
+ def initialize(*alive_cells)
+ @alive_cells = alive_cells.uniq
+ end
+
+ def [](x, y)
+ @alive_cells.include? [x, y]
+ end
+
+ def each(&block)
+ @alive_cells.each(&block)
+ end
+
+ def next_generation
+ next_gen = select { | x, y | (2..3) === alive_neighbours_count(x,y) } # Rules #1,#2 and #3
+ each do | x, y |
+ #Rule 4
+ next_gen |= GameOfLife.neighbours(x,y).select { | x, y | 3 == alive_neighbours_count(x,y) }
+ end
+ Board.new *next_gen
+ end
+
+ def alive_neighbours_count(x, y)
+ GameOfLife.neighbours(x, y).count { |x, y | self[x, y] }
+ end
+ end
+end
- Вместо
module_function
, ползвай простоdef self.neighbours
:) Не мисля, че в случая ти трябва функционалността, коятоmodule_function
дава. - Не разбирам защо не сложи кода от
#evolved
направо в#next_generation
- Аз лично предпочитам да викам методи с
.
, напримерGameOfLife.neighbours
вместоGameOfLife::neighbours
- Слагай малко whitespace, много си го нагъчкал тоя
neighbours
метод :) - В
alive_neighbours_count
може да подаваш блок директно наcount
— пробвай :) - Не си съвсем консистентен с поставянето на
whitespace
, както и с Ruby whitespace-конвенциите — можеш още! :)
Иначе, решението е прилично, поздравления.