Нели обнови решението на 15.10.2012 13:06 (преди около 12 години)
+class Integer
+
+ def prime?
+ possible = (2..self-1)
+
+ possible.each do |d|
+ return false if self % d == 0
+ end
+
+ true
+ end
+
+ def prime_divisors
+ num = self.abs
+ return [num] if num.prime?
+ result = []
+ possible = (2..num-1)
+
+ possible.each do |d|
+ result << d if d.prime? and num % d == 0
+ end
+
+ return result
+ end
+
+end
+
+
+class Range
+
+ def fizzbuzz
+ result = []
+
+ self.each do |number|
+ if number % 3 == 0 && number % 5 == 0
+ result << :fizzbuzz
+ elsif number % 3 == 0
+ result << :fizz
+ elsif number % 5 == 0
+ result << :buzz
+ else
+ result << number
+ end
+ end
+
+ result
+ end
+
+end
+
+class Hash
+
+ def group_values
+ result = Hash.new { |h,k| h[k] = (self.select { |key,value| value == k }).keys}
+
+ self.each_value { |value| result[value]}
+
+ result
+ end
+
+end
+
+class Array
+
+ def densities
+ result = []
+
+ self.each { |elem| result << self.count(elem) }
+
+ result
+ end
+
+end
- първа задача -- range е добре да е до sqrt(self) -- за prime? използва се each наистина но подобно на моето решение това напомня повече за процедурен стил сега се сещам че един по-лесен запис е с inject
def prime? (2..Math.sqrt(self)).inject(true) { |is_prime, el| is_prime && self % el != 0 } end
- за долното както вече разбрахме може да се ползва map :)
- на Array хубаво си се сетила за count :) Личи се че слушаш в час ПС Аз тука съм писал глупости :D
Ето обещаният коментар и от нас :)
-
(2..self-1)
може да бъде итерирано директно (напр. съсselect
); допълнително, може да се запише и така:(2...self)
, т.е. с exclusive range; същото важи и за ред 17 - Трябва да оставяш интервали около
{
и}
, когато става дума за блок (напр. ред 54); за справка виж ръководството за стил на курса -
self.
е излишно на всички места, на които го ползваш; в такива случаи се изпуска по конвенция - Не оставяй празен ред след началото на дефиниция на клас (
class Something
) и преди края й (end
) -
fizzbuzz
иdensities
се получават много добре сmap
- Хешът, който връщаш на потребителя в
group_values
има особен страничен ефект и той е, че като човек поиска несъществуващ ключ, ще получи празен списък, вместоnil
; това е окей при хешове за вътрешна употреба, но не е окей за хешове, връщани на потребителя - Допълнително, начинът, по който създаваш хеша в
group_values
е много странен и е почти като следствие от страничен ефект, което не е хубаво; далеч е от необходимата проста логика; вече си видяла примерното ни решение, може да хвърлиш око и на решенията, на които сме дали бонус точки, за още малко идеи как може да стане този метод -
нещо % 3 == 0 and нещо % 5 == 0
може да се запише и по-кратичко —нещо % 15 == 0
... :) -
return
пред последния израз в метод е излишен и се изпуска; това важи за ред 23 - В конкретния случай, оставянето на тези празни редове около "основната сметка" в методи като
group_values
&densities
е малко в повече, понеже методите са достатъчно прости и иначе и редовете не помагат особено на четимостта; в тези случаи аз бих ги изпуснал
Иначе, решението ти е доста прилично, поздравления :)