Решение на Първа задача от Емил Гоцев

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

Към профила на Емил Гоцев

Резултати

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

Код

class Integer
def prime_divisors
array = []
pos_self = self.abs
pos_self.downto(2) { |n| array << n if pos_self % n == 0 and n.prime? }
array.sort!
return array unless array.empty?
nil
end
def prime?
is_prime = true
self.downto 2 do |n|
is_prime = false if self % n == 0 and n != self
end
is_prime
end
end
class Range
def fizzbuzz
array = []
self.each do |n|
if n % 3 == 0 and n % 5 == 0
array << :fizzbuzz
elsif n % 3 == 0
array << :fizz
elsif n % 5 == 0
array << :buzz
else
array << n
end
end
array
end
end
class Hash
def group_values
values = Hash.new { |hash, key| hash[key]=[] }
self.keys.each do |n|
values[self[n]] << n
end
values
end
end
class Array
def densities
self.collect do |item|
if item.is_a? Integer
return item
end
counter = 0
self.each do |n|
if n == item
counter+=1
end
end
counter
end
end
end

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

........

Finished in 0.00743 seconds
8 examples, 0 failures

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

Емил обнови решението на 15.10.2012 16:50 (преди около 12 години)

+class Integer
+ def prime_divisors
+ array = []
+ pos_self = self.abs
+ pos_self.downto(2) { |n| array << n if pos_self % n == 0 and n.prime? }
+ array.sort!
+ return array unless array.empty?
+ nil
+ end
+
+ def prime?
+ is_prime = true
+ self.downto 2 do |n|
+ is_prime = false if self % n == 0 and n != self
+ end
+ is_prime
+ end
+end
+
+class Range
+ def fizzbuzz
+ array = []
+ self.each do |n|
+ if n % 3 == 0 and n % 5 == 0
+ array << :fizzbuzz
+ elsif n % 3 == 0
+ array << :fizz
+ elsif n % 5 == 0
+ array << :buzz
+ else
+ array << n
+ end
+ end
+ array
+ end
+end
+
+class Hash
+ def group_values
+ values = Hash.new { |hash, key| hash[key]=[] }
+ self.keys.each do |n|
+ values[self[n]] << n
+ end
+ values
+ end
+end
+
+class Array
+ def densities
+ self.collect do |item|
+ if item.is_a? Integer
+ return item
+ end
+ counter = 0
+ self.each do |n|
+ if n == item
+ counter+=1
+ end
+ end
+ counter
+ end
+ end
+end
  • Идентацията ти не е наред и съгласно предупрежденията ни, ти отнемаме една точка за това; за справка виж ръководството за стил на курса
  • self. е излишно на всички места, на които го ползваш; в такива случаи се изпуска по конвенция
  • Хешът, който връщаш на потребителя в group_values има особен страничен ефект и той е, че като човек поиска несъществуващ ключ, ще получи празен списък, вместо nil; това е окей при хешове за вътрешна употреба, но не е окей за хешове, връщани на потребителя
  • В Range#fizzbuzz можеш спокойно да ползваш map и да си опростиш кода
  • нещо % 3 == 0 and нещо % 5 == 0 може да се запише и по-кратичко — нещо % 15 == 0... :)
  • Ред 6-8 не са окей: правиш излишни неща, които условието не иска; човек трябва да се стреми да не пише излишен код, защото колкото повече код, толкова повече проблеми :) Още повече, че ползваш мутиращ метод, Array#sort!, което може да се избегне, като пренапишеш малко редовете по-горе; най-малкото като направиш 2.upto(pos_self), а и pos_self е неподходящо име на променлива; поне да беше positive_self.
  • В densities правиш купчина излишни неща, например това is_a?, което е "миризма" в Руби и като цяло се избягва