Владимир обнови решението на 15.10.2012 03:58 (преди около 12 години)
+class Integer
+ def prime_divisors
+ unless self == 0 or self.abs == 1
+ divisors = Array.new
+ abs_number = self.abs
+ is_prime = ->(number) { ('1' * number) !~ /^1?$|^(11+?)\1+$/ }
+ abs_number.times do |counter|
+ divisor = counter + 1
+ unless divisor == 1
+ if self % divisor == 0 and is_prime.(divisor)
+ divisors << divisor
+ end
+ end
+ end
+ divisors
+ end
+ end
+end
+
+class Range
+ def fizzbuzz
+ self.to_a.collect do |number|
+ if number % 3 == 0 and number % 5 == 0
+ :fizzbuzz
+ elsif number % 3 == 0
+ :fizz
+ elsif number % 5 == 0
+ :buzz
+ else
+ number
+ end
+ end
+ end
+end
+
+class Hash
+ def group_values
+ result = Hash.new
+ self.each do |key, value|
+ result[value] = [] if result[value].nil?
+ result[value] << key
+ end
+ result
+ end
+end
+
+class Array
+ def densities
+ self.collect { |x| self.count(x) }
+ end
+end
Малко коментари:
-
self.
е излишно на всички места, на които го ползваш; в такива случаи се изпуска по конвенция -
Array.new
,Hash.new
и т.н. никога не се ползват в този си вид (без аргументи); винаги се предпочита литералния синтаксис в тези случаи, т.е.[]
,{}
и прочее -
нещо % 3 == 0 and нещо % 5 == 0
може да се запише и по-кратичко —нещо % 15 == 0
... :) (ред 19) -
fizzbuzz
се получава по-добре сmap
- Предпочитай
map
предcollect
(синоними са, но първото се предпочита) - Не проверявай за просто число с регулярен израз... :) Ясно е, че е забавно, но се разминаваш с наказателна точка само защото това е първа задача и защото идентацията и конвенциите са ти перфектни :)
Прилично първо решение, поздравления :)