Мария обнови решението на 20.12.2011 23:53 (преди около 13 години)
+module GameOfLife
+ require 'enumerator'
+
+ class Board
+ include Enumerable
+
+ def initialize(*args)
+ @cells = args.uniq
+ @next_cells = []
+ @to_go_alive = []
+ inspect
+ end
+
+ def each
+ @cells.each { |cell| yield cell }
+ end
+
+ def next_generation
+ evolve
+ resurrect
+ Board.new(@next_cells.uniq)
+ end
+
+ def [](a, b)
+ (@cells & [[a, b]]) != []
+ end
+
+ def inspect
+ "Board: #{@cells.inspect}"
+ end
+
+ private
+ def find_neighbours(cell)
+ auxiliary = [-1, -1, 0, 0, 1, 1]
+ offsets = auxiliary.permutation(2).to_a.uniq - [[0, 0]]
+ neighbours = offsets.map { |offset| [offset[0] + cell[0], offset[1] + cell[1]] }
+ end
+
+ def count_alive_neighbours(cell)
+ neighbours = find_neighbours(cell)
+ (@cells & neighbours).size
+ end
+
+ def evolve
+ @cells.each do |cell|
+ if count_alive_neighbours(cell) == 2 or count_alive_neighbours(cell) == 3
+ @next_cells += [cell]
+ end
+ @to_go_alive += find_neighbours(cell)
+ end
+ end
+
+ def resurrect
+ @to_go_alive.uniq.each do |cell|
+ if count_alive_neighbours(cell) == 3
+ @next_cells += [cell]
+ end
+ end
+ end
+ end
+end
Винаги в последния момент, without fail :)
- За какво ти е този
require 'enumerator'
? По-скоро не ти трябва :) - Като имаш
require
, го слагай извън модула, в началото на файла; така или иначе, няма смисъл да е в модул -
#inspect
— gut! :) Може би не трябва да го викаш вinitialize
, обаче; а и там няма никакъв смисъл, върнатата стойност отinitialize
се изхвърля така или иначе - Може би щеше да е по-добре
evolve
иresurrect
просто да връщаха резултат, вместо да тъпчат в инстанционна променлива; и после, вnext_generation
, нещо катоBoard.new *(evolve + resurrect)
(или нещо в този дух) - Един празен ред след
private
и преди следващата дефиниция на метод
Хаха, този път имам fail :D Ами, който си доспива, не си дописва...
Мерси за коментарите :)
Всъщност inspect беше за дебъг, не бих го сложила в конструктура при нормални обстоятелства :D Пардон, трябваше да го махна.
А това с променливите на инстанцията е голяма идиотщина, признавам си. Хаха, сега искам да си го променя :)