Решение на Първа задача от Владимир Коричков

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

Към профила на Владимир Коричков

Резултати

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

Код

class Integer
def prime_divisors
unless self == 0 or self.abs == 1
divisors = Array.new
abs_number = self.abs
is_prime = ->(number) { ('1' * number) !~ /^1?$|^(11+?)\1+$/ }
abs_number.times do |counter|
divisor = counter + 1
unless divisor == 1
if self % divisor == 0 and is_prime.(divisor)
divisors << divisor
end
end
end
divisors
end
end
end
class Range
def fizzbuzz
self.to_a.collect do |number|
if number % 3 == 0 and number % 5 == 0
:fizzbuzz
elsif number % 3 == 0
:fizz
elsif number % 5 == 0
:buzz
else
number
end
end
end
end
class Hash
def group_values
result = Hash.new
self.each do |key, value|
result[value] = [] if result[value].nil?
result[value] << key
end
result
end
end
class Array
def densities
self.collect { |x| self.count(x) }
end
end

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

........

Finished in 0.00898 seconds
8 examples, 0 failures

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

Владимир обнови решението на 15.10.2012 03:58 (преди около 12 години)

+class Integer
+ def prime_divisors
+ unless self == 0 or self.abs == 1
+ divisors = Array.new
+ abs_number = self.abs
+ is_prime = ->(number) { ('1' * number) !~ /^1?$|^(11+?)\1+$/ }
+ abs_number.times do |counter|
+ divisor = counter + 1
+ unless divisor == 1
+ if self % divisor == 0 and is_prime.(divisor)
+ divisors << divisor
+ end
+ end
+ end
+ divisors
+ end
+ end
+end
+
+class Range
+ def fizzbuzz
+ self.to_a.collect do |number|
+ if number % 3 == 0 and number % 5 == 0
+ :fizzbuzz
+ elsif number % 3 == 0
+ :fizz
+ elsif number % 5 == 0
+ :buzz
+ else
+ number
+ end
+ end
+ end
+end
+
+class Hash
+ def group_values
+ result = Hash.new
+ self.each do |key, value|
+ result[value] = [] if result[value].nil?
+ result[value] << key
+ end
+ result
+ end
+end
+
+class Array
+ def densities
+ self.collect { |x| self.count(x) }
+ end
+end

Малко коментари:

  • self. е излишно на всички места, на които го ползваш; в такива случаи се изпуска по конвенция
  • Array.new, Hash.new и т.н. никога не се ползват в този си вид (без аргументи); винаги се предпочита литералния синтаксис в тези случаи, т.е. [], {} и прочее
  • нещо % 3 == 0 and нещо % 5 == 0 може да се запише и по-кратичко — нещо % 15 == 0... :) (ред 19)
  • fizzbuzz се получава по-добре с map
  • Предпочитай map пред collect (синоними са, но първото се предпочита)
  • Не проверявай за просто число с регулярен израз... :) Ясно е, че е забавно, но се разминаваш с наказателна точка само защото това е първа задача и защото идентацията и конвенциите са ти перфектни :)

Прилично първо решение, поздравления :)