Никола обнови решението на 15.10.2012 02:21 (преди около 13 години)
+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! :)
