Илия обнови решението на 15.10.2012 04:39 (преди около 12 години)
+class Integer
+ def prime?
+ (2..self/2).each { |n| return false if self % n == 0 }
+ true
+ end
+
+ def prime_divisors
+ puts "prime_divisors not defined for -1,0,1" if self.abs<2
+ (2..self.abs).select { |n| n.prime? and self % n == 0 }
+ end
+end
+
+class Range
+ def fizzbuzz
+ collect do |n|
+ case
+ when n % 15 == 0 then :fizzbuzz
+ when n % 3 == 0 then :fizz
+ when n % 5 == 0 then :buzz
+ else n
+ end
+ end
+ end
+end
+
+class Hash
+ def group_values
+ result = {}
+ each do |key,value|
+ result[value] ||= []
+ result[value] << key
+ end
+ result
+ end
+end
+
+class Array
+ def densities
+ result = []
+ each { |x| result << select { |y| x == y } .size }
+ result
+ end
+end
Хубаво решение! Забележките са:
- Не оставяй странични ефекти в решенията. Пуцането в следващите задачи няма да се толерира :)
- Погледни
Array#map
:) -
case
израза въвRange#fizzbuzz
изглежда добре, но не винагиcase
без условие е добра идея. - Малко стилистични забележки: оставяй разстояния между операторите;
|key,value|
->|key, value|
;select { |y| x == y } .size
->select { |y| x == y }.size
; Погледни блок секцията на https://github.com/fmi/ruby-style-guide#syntax
Освен това, всичко е много добре!
За протокола, puts
-а там не е ОК. Ако 0 и 1 са невалидни стойности за твоята функция, тогава хвърляй изключение, вместо да извеждаш нещо на екрана и да продължаваш изпълнението на програмата.