Владимир обнови решението на 15.10.2012 03:58 (преди около 13 години)
+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(синоними са, но първото се предпочита) - Не проверявай за просто число с регулярен израз... :) Ясно е, че е забавно, но се разминаваш с наказателна точка само защото това е първа задача и защото идентацията и конвенциите са ти перфектни :)
 
Прилично първо решение, поздравления :)
