Свилен обнови решението на 13.10.2012 16:00 (преди около 12 години)
+ class Integer
+ def prime?
+ return true if self == 2
+ (2.. Math.sqrt(self)+2 ).each do |n|
+ return false if self % n == 0
+ end
+ true
+ end
+
+ def prime_divisors
+ (2..self.abs).collect{ |n| n if (n.prime? && self % n == 0 )}.compact
+ end
+end
+
+ class Range
+ def fizzbuzz
+ (self).collect do |n|
+ (n % 3 == 0) ? ((n % 5 == 0) ? :fizzbuzz : :fizz) : ((n % 5 == 0) ? :buzz : n)
+ end
+ end
+ end
+
+
+class Hash
+ def group_values
+ n = Hash.new { |p,k| p[k] = [] }
+ each {|k,v| n[v] << k}
+ n
+ end
+end
+
+ class Array
+ def densities
+ p = Hash.new(0)
+ self.each { |v| p[v] += 1 }
+ _arr = []
+ self.each { |v| _arr << p[v] }
+ _arr
+ end
+ end
- можеш да икономисаш
return
вprime?
като просто ползвашall?/'none?
върхуRange
-
self
на много места ти е излишен - На мястото на
map {}.compact
вероятно си имал предвид простоselect
- Вложен тернарен оператор е нещо, което виждам рядко дори и в C. В подобни случаи е по-разбираемо да си ползваш нормален
if
. - Избягвай такива еднобуквени имена на променливи (дори и когато ти е единствената променлива във функцията) - отнема повече време за прочитане
- Това което си направил с
densities
спокойно може да се получи сp.values
. Производителността на кода не е ключова цел на курса и в случая е могло в името на четимостта да си ползвашmap { |element| count element }
, въпреки че е напълно възможно да преброиsize
пъти абсолютно един и същи елемент.
-
_arr
е отвратително име на променлива. Защо с подчертавка отпред? Защо неarray
? Ако е резултат, защо неresult
? Хубаво е да се мисли когато се наименоват неща. -
(self).collect
- защо има скоби околоself
? - Вложения тернарен оператор е зло.
- Защо променливата ти се казва
p
? Сериозно? Защоp
? - Идентацията ти и останалия whitespace са много объркани. В резултат, кода ти изглежда мърляв. Това ще ти струва една точка.
Приемам забележките и благодаря, повече няма да се повторят :)