Решение на Първа задача от Йордан Стефанов

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

Към профила на Йордан Стефанов

Резултати

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

Код

class Integer
def prime_divisors
return (-self).prime_divisors if self < 0
return nil if [0,1].include? self
def prime? n
not (2...n).map {|x| n % x}.include? 0
end
(2...self).to_a.delete_if { |x| not prime? x or not self % x == 0 }
end
end
class Range
def fizzbuzz
def map_f n
if n % 3 == 0 and n % 5 == 0
:fizzbuzz
elsif n % 3 == 0
:fizz
elsif n % 5 == 0
:buzz
else
n
end
end
self.map { |x| map_f x }
end
end
class Hash
def group_values
ans = {}
def insert_key ans, k, v
if ans[v] == nil
ans[v] = [k]
else
ans[v] << k
end
end
self.each { |k, v| insert_key ans, k, v }
ans
end
end
class Array
def densities
self.map { |x| self.count x }
end
end

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

........

Finished in 0.0084 seconds
8 examples, 0 failures

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

Йордан обнови решението на 15.10.2012 12:56 (преди около 12 години)

+class Integer
+ def prime_divisors
+ return (-self).prime_divisors if self < 0
+ return nil if [0,1].include? self
+ def prime? n
+ not (2...n).map {|x| n % x}.include? 0
+ end
+ (2...self).to_a.delete_if { |x| not prime? x or not self % x == 0 }
+ end
+end
+
+class Range
+ def fizzbuzz
+ def map_f n
+ if n % 3 == 0 and n % 5 == 0
+ :fizzbuzz
+ elsif n % 3 == 0
+ :fizz
+ elsif n % 5 == 0
+ :buzz
+ else
+ n
+ end
+ end
+ self.map { |x| map_f x }
+ end
+end
+
+class Hash
+ def group_values
+ ans = {}
+ def insert_key ans, k, v
+ if ans[v] == nil
+ ans[v] = [k]
+ else
+ ans[v] << k
+ end
+ end
+ self.each { |k, v| insert_key ans, k, v }
+ ans
+ end
+end
+
+class Array
+ def densities
+ self.map { |x| self.count x }
+ end
+end
  • Никога не дефинирай метод в метод с def; Ruby не е Lisp, JavaScript или друг език, където това би имало друг, очакван ефект; тук стават неща, които не очакваш и не сме го показвали така; ако искаш да обособиш метод, или си правиш lambda, или си извеждаш метода в същия или нов клас
  • Допълнително, идентацията и употребата ти на whitespace не е наред и съгласно предупрежденията ни, ти отнемаме една точка за това; за справка виж ръководството за стил на курса
  • В Range#fizzbuzz, например, няма нужда да извеждаш отделен метод, можеше просто да напишеш map do ... и да сложиш след това в блока тялото на този метод с ужасното име map_f
  • Вероятно знаеш, ако си бил на последната лекция, че имена като ans са зле избрани и че трябва да се постараеш повече в това направление следващия път
  • self. е излишно на всички места, на които го ползваш; в такива случаи се изпуска по конвенция
  • Ред 33 до 37 обикновено се записват така: ans[v] ||= []; ans[v] << k (само че на два реда; и игнорирам лошите имена на променливи тук)
  • нещо % 3 == 0 and нещо % 5 == 0 може да се запише и по-кратичко — нещо % 15 == 0... :)
  • Да мутираш списък не е много добра идея в случая (визирам delete_if). Може да го избегнеш с помощта на select. Старай се да избягваш мутиране, докато не свикнеш с map, select, reject и прочее методи от Enumerable

Ruby изисква малко време човек да свикне с него, но после се отплаща многократно. Постарай се да нагодиш мисленето си в Ruby-идиоми и ще видиш, че ще имаш полза дори в ежедневното си писане на C#, ако щеш.