Решение на Първа задача от Нели Хатева

Обратно към всички решения

Към профила на Нели Хатева

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 8 успешни тест(а)
  • 0 неуспешни тест(а)

Код

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

Лог от изпълнението

........

Finished in 0.00772 seconds
8 examples, 0 failures

История (1 версия и 2 коментара)

Нели обнови решението на 15.10.2012 13:06 (преди над 11 години)

+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 е малко в повече, понеже методите са достатъчно прости и иначе и редовете не помагат особено на четимостта; в тези случаи аз бих ги изпуснал

Иначе, решението ти е доста прилично, поздравления :)