Любомир обнови решението на 15.10.2012 03:10 (преди над 12 години)
+class Integer
+ def prime_divisors
+ divisors = Array.new
+ expected_divisor = 2
+ number = self.abs
+ while expected_divisor <= number
+ if number % expected_divisor == 0
+ divisors << expected_divisor
+ while number % expected_divisor == 0
+ number /= expected_divisor
+ end
+ else
+ expected_divisor += 1
+ end
+ end
+ divisors
+ end
+end
+
+class Range
+ def fizzbuzz
+ fizzbuzzed = Array.new
+ self.each do |x|
+ if x % 15 == 0
+ fizzbuzzed << :fizzbuzz
+ elsif x % 5 == 0
+ fizzbuzzed << :buzz
+ elsif x % 3 == 0
+ fizzbuzzed << :fizz
+ else
+ fizzbuzzed << x
+ end
+ end
+ fizzbuzzed
+ end
+end
+
+class Hash
+ def group_values
+ grouped = Hash.new
+ self.each do |key, value|
+ if grouped.key? value
+ grouped[value] << key
+ else
+ grouped = grouped.merge Hash[value, Array[key]]
+ end
+ end
+ grouped
+ end
+end
+
+class Array
+ def densities
+ self.collect {|x| self.count(x)}
+ end
+end
- Идентацията и употребата ти на whitespace не е съвсем наред, по-специално около
{
и}
в случай на блок; внимавай, защото за тов ще отнемаме точки занапред; за справка виж ръководството за стил на курса -
self.
е излишно на всички места, на които го ползваш; в такива случаи се изпуска по конвенция -
Array.new
,Hash.new
и т.н. никога не се ползват в този си вид (без аргументи); винаги се предпочита литералния синтаксис в тези случаи, т.е.[]
,{}
и прочее - Това
grouped = grouped.merge Hash[value, Array[key]]
е ужасен начин да напишешgrouped[value] = [key]
; ама ужасен... Не искам да го виждам повече :) - Предпочитай
map
предcollect
(синоними са, но първото се предпочита) -
fizzbuzz
се получават по-добре сmap
Иначе, решението ти не е зле за първи опит ;)