Теодор обнови решението на 15.10.2012 03:57 (преди около 12 години)
+class Integer
+ def prime_divisors
+ 2.upto(self.abs).select { |a| a.isPrime? and self.remainder(a).zero? }
+ end
+
+ def isPrime?
+ 2.upto(self - 1).all? { |a| self.remainder(a).nonzero? }
+ end
+end
+
+class Range
+ def fizzbuzz
+ self.map { |a| convert a }
+ end
+
+ def convert(number)
+ if number.remainder(15).zero?
+ :fizzbuzz
+ elsif number.remainder(3).zero?
+ :fizz
+ elsif number.remainder(5).zero?
+ :buzz
+ else
+ number
+ end
+ end
+end
+
+class Hash
+ def group_values
+ aggregating_inverted_hash = Hash.new { [] }
+ self.each { |x, y| aggregating_inverted_hash[y] <<= x }
+ aggregating_inverted_hash
+ end
+end
+
+class Array
+ def densities
+ self.map { |x| self.count x }
+ end
+end
Щях да те накажа за този isPrime?
, който е грубо нарушение на конвенциите на езика, но всички останали конвенции са ти почти перфектни, а и си ползвал map
& count
където трябва, така че само този път ти се разминава (но и не получаваш бонус точки, които иначе ти бяха вързани в кърпа)
-
aggregating_inverted_hash
не е много добро име -
Hash.new { [] }
не работи така, както очакваш; пробвай го вirb
, ще видиш, чеgroup_values
няма да ти работи заради това; консултирай се с документацията -
self.
е излишно на всички места, на които го ползваш; в такива случаи се изпуска по конвенция - Вместо
number.remainder(divisor)
се предпочита по-простата употреба на "оператора" (то пак е метод)%
, т.е.number % divisor
Като изклчим тези дребни бележки, решението ти е много добро, поздравления.