Решение на Шеста задача от Мартин Маринов

Обратно към всички решения

Към профила на Мартин Маринов

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 18 успешни тест(а)
  • 0 неуспешни тест(а)

Код

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

Лог от изпълнението

..................

Finished in 0.42598 seconds
18 examples, 0 failures

История (1 версия и 1 коментар)

Мартин обнови решението на 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-конвенциите — можеш още! :)

Иначе, решението е прилично, поздравления.