Димо обнови решението на 15.12.2011 01:40 (преди около 13 години)
+module GameOfLife
+
+ class Board
+ include Enumerable
+
+ def initialize *cells
+ @list = cells.uniq
+ end
+
+ def each
+ @list.each { |cell| yield cell }
+ end
+
+ def neighbours cell
+ x, y = cell
+ [[x + 1, y], [x + 1, y + 1], [x + 1, y - 1], [x, y + 1],
+ [x - 1, y], [x - 1, y + 1], [x - 1, y - 1], [x, y - 1]]
+ end
+
+ def alive_neighbours cell
+ (neighbours cell).select { |cell| @list.include? cell }.size
+ end
+
+ def [] *cell
+ @list.include? cell
+ end
+
+ def staying_alive_cells
+ @list.select { |cell| alive_neighbours(cell) == 2 or alive_neighbours(cell) == 3 }
+ end
+
+ def new_born_cells
+ all_neighbours = @list.inject([]) { |cells, cell| cells | neighbours(cell) }
+ all_neighbours.select { |cell| alive_neighbours(cell) == 3}
+ end
+
+ def next_generation
+ Board.new *(staying_alive_cells | new_born_cells)
+ end
+ end
+end
- Какво прави методът
calc
? Намери му по-добро име :) -
res
иtmp
са неща, от които намирисва — ако ти се наложи да ги пишеш, по-добре помисли дали има начин да ги избегнеш, а ако не — поне ги преименувай по-описателно - За да циклиш по
Enumerable
неща, ползвайeach
, а неmap
—map
има друго предназначение :) -
initialize
ти е буквално еквивалентен на@list = cells.dup
, а мисля, че може да изпуснеш иdup
-а, тъй като никъде не променяш @list :) -
count
ти идва наготово отEnumerable
- В
neighbours
имам малко възражения, че си се скъсал да пишешcell[0/1]
— по-добре ги присвои тези неща на нещо:x, y = cell
:)
Иначе, като цяло, решението ти изглежда прилично, поздравления!