Решение на Първа задача от Георги Гърдев

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

Към профила на Георги Гърдев

Резултати

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

Код

class Integer
def prime?
return true if self == 2
sqrt_limit = Math.sqrt(self).ceil
(2..sqrt_limit).each { |i| return false if self % i == 0 }
true
end
def prime_divisors
x = self.abs
return nil if [0, 1].include? x
divisors = []
(2..x).each { |i| divisors.push(i) if x % i == 0 and i.prime? }
divisors
end
end
class Range
def fizzbuzz
list = []
self.each do |n|
if n % 15 == 0
list.push :fizzbuzz
elsif n % 3 == 0
list.push :fizz
elsif n % 5 == 0
list.push :buzz
else
list.push n
end
end
list
end
end
class Hash
def group_values
hash = Hash.new
self.each do |key, value|
hash[value] = Array.new if hash[value].nil?
hash[value].push key
end
hash
end
end
class Array
def densities
el_count = []
self.each { |n| el_count.push self.count(n) }
el_count
end
end

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

........

Finished in 0.00757 seconds
8 examples, 0 failures

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

Георги обнови решението на 14.10.2012 20:34 (преди над 11 години)

+class Integer
+ def prime?
+ return true if self == 2
+
+ sqrt_limit = Math.sqrt(self).ceil
+ (2..sqrt_limit).each { |i| return false if self % i == 0 }
+
+ true
+ end
+
+ def prime_divisors
+ x = self.abs
+ return nil if [0, 1].include? x
+
+ divisors = []
+ (2..x).each { |i| divisors.push(i) if x % i == 0 and i.prime? }
+
+ divisors
+ end
+end
+
+class Range
+ def fizzbuzz
+ list = []
+
+ self.each do |n|
+ if n % 15 == 0
+ list.push :fizzbuzz
+ elsif n % 3 == 0
+ list.push :fizz
+ elsif n % 5 == 0
+ list.push :buzz
+ else
+ list.push n
+ end
+ end
+
+ list
+ end
+end
+
+class Hash
+ def group_values
+ hash = Hash.new
+
+ self.each do |key, value|
+ hash[value] = Array.new if hash[value].nil?
+ hash[value].push key
+ end
+
+ hash
+ end
+end
+
+class Array
+ def densities
+ el_count = []
+ self.each { |n| el_count.push self.count(n) }
+
+ el_count
+ end
+end
  • Добре подредено решение, харесва ми! :)
  • Шаблонът list = []; ...each { |x| list << x }; list се нарича map и трябва да ползваш него :) Например в densities и fizzbuzz
  • В prime_divisors може пък да ползваш select
  • self. е излишно на всички места, на които го ползваш; в такива случаи се изпуска по конвенция
  • Array.new, Hash.new и т.н. никога не се ползват в този си вид (без аргументи); винаги се предпочита литералния синтаксис в тези случаи, т.е. [], {} и прочее
  • Предпочитай да ползваш Array#<< пред Array#push за добавяне на елементи в списък; т.е. some_list << foo

Благодаря за коментара :) Повечето неща не ги знаех, и за това съм писал така, следващия път по-добре :)

Един въпрос - за функции от типа Math.sqrt() мога ли да избегна ползването на self? Защото sqrt() очевидно очаква аргумент.. може ли да се направи по друг начин?