Решение на Първа задача от Иван Арабаджиев

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

Към профила на Иван Арабаджиев

Резултати

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

Код

class Integer
def prime_divisors
2.upto(abs).select { |number| self % number == 0 and ('1' * number) !~ /^1?$|^(11+?)\1+$/ }
end
end
class Range
def fizzbuzz
map do |number|
if number % 15 == 0 then :fizzbuzz
elsif number % 3 == 0 then :fizz
elsif number % 5 == 0 then :buzz
else number
end
end
end
end
class Hash
def group_values
grouped = Hash.new { |hash, key| hash[key] = [] }
each { |key, value| grouped[value] << key }
grouped.default = nil
grouped
end
end
class Array
def densities
map { |el| count el }
end
end

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

........

Finished in 0.00746 seconds
8 examples, 0 failures

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

Иван обнови решението на 14.10.2012 11:48 (преди около 12 години)

+class Integer
+ def prime_divisors
+ 2.upto(self.abs).select { |num| self % num == 0 and ('1' * num) !~ /^1?$|^(11+?)\1+$/ }
+ end
+end
+
+class Range
+ def fizzbuzz
+ self.map do |num|
+ if num % 15 == 0 then :fizzbuzz
+ elsif num % 3 == 0 then :fizz
+ elsif num % 5 == 0 then :buzz
+ else num
+ end
+ end
+ end
+end
+
+class Hash
+ def group_values
+ grouped = Hash.new { |hash, key| hash[key] = [] }
+ self.each_pair { |key, value| grouped[value] << key }
+ grouped
+ end
+end
+
+class Array
+ def densities
+ self.map { |el| self.count el }
+ end
+end
  • Имаш малки неконсистентности в идентацията, фиксни ги :)
  • Този регулярен израз, с който проверяваш за прости числа минава само защото ни купи вода предния път... ;)
  • Изпускай self., в твоя случай никъде не е нужно и обикновено се изпуска в тези ситуации
  • number е по-добре от num; референция тук: http://37signals.com/svn/posts/3250-clarity-over-brevity-in-variable-and-method-names
  • Хешове обикновено се циклят с each, не each_pair
  • Връщаният хеш от group_values има страничен ефект, че като поискаш липсващ ключ, получаваш празен списък; може би искаш да избягаш от този страничен ефект :)
  • "Clarity over brevity"

Иван обнови решението на 14.10.2012 14:42 (преди около 12 години)

class Integer
def prime_divisors
- 2.upto(self.abs).select { |num| self % num == 0 and ('1' * num) !~ /^1?$|^(11+?)\1+$/ }
+ 2.upto(abs).select { |number| self % number == 0 and ('1' * number) !~ /^1?$|^(11+?)\1+$/ }
end
end
class Range
def fizzbuzz
- self.map do |num|
- if num % 15 == 0 then :fizzbuzz
- elsif num % 3 == 0 then :fizz
- elsif num % 5 == 0 then :buzz
- else num
- end
+ map do |number|
+ if number % 15 == 0 then :fizzbuzz
+ elsif number % 3 == 0 then :fizz
+ elsif number % 5 == 0 then :buzz
+ else number
+ end
end
end
end
class Hash
def group_values
grouped = Hash.new { |hash, key| hash[key] = [] }
- self.each_pair { |key, value| grouped[value] << key }
+ each { |key, value| grouped[value] << key }
+ grouped.default = nil
grouped
end
end
class Array
def densities
- self.map { |el| self.count el }
+ map { |el| count el }
end
end

Така е по-прилично. За отделен метод в Integer - би могло. Доста колеги са го направили така, но пък трябва да се внимава, защото все пак е разширение на вграден клас. В конкретния случай аз бих казал, че е окей да отделиш проверката за просто число в отделен метод.