Живко обнови решението на 15.10.2012 14:34 (преди около 12 години)
+class Integer
+ def prime_divisors
+ res = []
+ number = self.abs
+ upper_limit = ( number / 2 ).ceil
+ 2.upto( upper_limit ) do |divisor|
+ if number % divisor == 0
+ skip = 0
+ res.each do |old_divisor|
+ if divisor % old_divisor == 0
+ skip = 1
+ break;
+ end
+ end
+ if skip != 1
+ res.push divisor
+ end
+ end
+ end
+ if res == []
+ res = [number]
+ end
+ res
+ end
+end
+
+class Range
+ def fizzbuzz
+ self.collect do |n|
+ if n % 3 == 0 and n % 5 == 0
+ :fizzbuzz
+ elsif n % 5 == 0
+ :buzz
+ elsif n % 3 == 0
+ :fizz
+ else
+ n
+ end
+ end
+ end
+end
+
+class Hash
+ def group_values
+ res = {}
+ self.each do |key, val|
+ if res.has_key?(val)
+ res[val].push key
+ else
+ res[val] = [key]
+ end
+ end
+ res
+ end
+end
+
+class Array
+ def densities
+ self.collect do |item|
+ self.select { |item2| item2 == item }.size
+ end
+ end
+end
- Живко, Живкооо... :) Идентацията и употребата ти на whitespace не е наред и съгласно предупрежденията ни, ти отнемаме една точка за това; за справка виж ръководството за стил на курса Другият път ще спазваш конвенциите, сигурен съм :)
-
res
,val
,item2
и подобни са лоши имена на променливи (вероятно си наясно с това, ако си присъствала на последната лекция) :) -
self.
е излишно на всички места, на които го ползваш; в такива случаи се изпуска по конвенция - Предпочитай да ползваш
Array#<<
предArray#push
за добавяне на елементи в списък; т.е.some_list << foo
- Предпочитай
map
предcollect
(синоними са, но първото се предпочита) - Това, което си направил в
densities
съсselect
и послеsize
е готино и близо до целта, но следващия път просто позлвайcount
:) -
prime_divisors
е станал малко тлъстичък и може би е добра идея да се разбие на два метода, както някои твои колеги са направили, добавяйки методprime?
Като цяло, решението ти е сравнително прилично като за първо домашно. Ако и идентацията ти беше наред, щях да се замисля и за бонус точки :) Следващия път ще очакваме да си безгрешен ;)