Никола обнови решението на 15.10.2012 02:21 (преди над 12 години)
+class Integer
+ def prime_divisors
+ result = []
+ current = self.abs
+ 2.upto current do |x|
+ while current.remainder(x).zero?
+ current = current/x
+ result << x
+ end
+ end
+ result.uniq
+ end
+end
+
+class Range
+ def fizzbuzz
+ result = []
+ self.each do |x|
+ if x.remainder(3).zero? and x.remainder(5).zero?
+ result << :fizzbuzz
+ elsif x.remainder(3).zero?
+ result << :fizz
+ elsif x.remainder(5).zero?
+ result << :buzz
+ else
+ result << x
+ end
+ end
+ result
+ end
+end
+
+class Array
+ def densities
+ result = []
+ self.each { |x| result.push self.count x }
+ result
+ end
+end
+
+class Hash
+ def group_values
+ result = {}
+ self.each do |key, value|
+ result[value] = [] unless result.has_key? value
+ result[value] << key
+ end
+ result
+ end
+end
- Вместо
number.remainder(divisor)
се предпочита по-простата употреба на "оператора" (то пак е метод)%
, т.е.number % divisor
-
self.
е излишно на всички места, на които го ползваш; в такива случаи се изпуска по конвенция -
нещо % 3 == 0 and нещо % 5 == 0
може да се запише и по-кратичко —нещо % 15 == 0
... :) (ред 19) - Предпочитай да ползваш
Array#<<
предArray#push
за добавяне на елементи в списък; т.е.some_list << foo
-
fizzbuzz
иdensities
се получават много добре сmap
; допълнително,densities
се прави на един ред, с този код:map { |item| count item }
:)
Като цяло, решението ти е добро за първо. Keep it up! :)