Мая обнови решението на 20.12.2011 23:43 (преди около 13 години)
+module GameOfLife
+ class Board
+ include Enumerable
+
+ def initialize(*cells)
+ @cells = cells
+ end
+
+ def [](x, y)
+ @cells.include? [x, y]
+ end
+
+ def each
+ for pair in @cells
+ yield pair
+ end
+ end
+
+ def count
+ @cells.size
+ end
+
+ def next_generation
+ ng = @cells.map {|pt| self.nearby pt}.flatten(1).uniq
+ ng.select! {|pt| self.should_live pt}
+ Board.new *ng
+ end
+
+ def should_live(pt)
+ cnt = count_near pt
+ (self[*pt] and (cnt == 2 or cnt == 3)) or (cnt == 3)
+ end
+
+ def count_near(pt)
+ nearby(pt).select {|pt| self[*pt] }.size
+ end
+
+ def nearby(pt)
+ [[pt[0], pt[1]+1], [pt[0], pt[1]-1], [pt[0]+1, pt[1]], [pt[0]-1, pt[1]],
+ [pt[0]+1, pt[1]+1], [pt[0]+1, pt[1]-1], [pt[0]-1, pt[1]+1], [pt[0]-1, pt[1]-1]]
+ end
+ end
+end
-
count
ти идва наготово отEnumerable
; ако искаш, дефинирай сиsize
(виж документацията) - Трябва да поработиш малко върху умението си да именоваш променливи и методи :)
УЖАСТ! for
! ЩЕ ТИ ВЗЕМЕМ ТОЧКИ!!!!!!1
Трябва да направиш жертвоприношение, за да смекчиш гнева и да омилостивиш боговете. Бррр.
(Другия път просто ползвай each
:)
- count-a го дефинирах, защото ми се стори, че така е по условие. Но явно не съм го направила според пълните спецификации, мерси! :)
- Ограничението за дължина на реда убива поетическите ми наклонности при именуване на променливи..
- Мога да напиша 100 пъти "Никога няма да пиша for!": for i in (1..100) p "Никога няма да пиша for!" end =D (вярно, забравих, с each става мъничко по-красиво :)