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

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

Към профила на Николай Колев

Резултати

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

Код

class Integer
def divides_of? number
self % number == 0
end
def prime?
self > 1 and (2..Math.sqrt(self)).all? { |x| not divides_of? x }
end
def prime_divisors
(2..abs).select { |x| divides_of? x and x.prime? }
end
end
class Range
def fizzbuzz
collect do |x|
if x.kind_of? Integer and (x.divides_of? 3 or x.divides_of? 5)
if x.divides_of? 3 and x.divides_of? 5
:fizzbuzz
elsif x.divides_of? 3
:fizz
else
:buzz
end
else
x
end
end
end
end
class Hash
def group_values
result = Hash.new { |hash, key| hash[key] = [] }
each { |key, value| result[value] << key }
result
end
end
class Array
def densities
densities = Hash.new { |hash, key| hash[key] = count(key) }
Array collect { |x| densities[x] }
end
end

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

........

Finished in 0.00743 seconds
8 examples, 0 failures

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

Николай обнови решението на 13.10.2012 15:33 (преди около 12 години)

+class Integer
+ def divides_of? number
+ self % number == 0
+ end
+
+ def prime?
+ self > 1 and (2..Math.sqrt(self)).all? { |x| not divides_of? x }
+ end
+
+ def prime_divisors
+ (2..abs).select { |x| divides_of? x and x.prime? }
+ end
+end
+
+class Range
+ def fizzbuzz
+ collect do |x|
+ if x.kind_of? Integer and (x.divides_of? 3 or x.divides_of? 5)
+ if x.divides_of? 3 and x.divides_of? 5
+ :fizzbuzz
+ elsif x.divides_of? 3
+ :fizz
+ else
+ :buzz
+ end
+ else
+ x
+ end
+ end
+ end
+end
+
+class Hash
+ def group_values
+ result = Hash.new { |hash, key| hash[key] = [] }
+ each { |key, value| result[value] << key }
+ result
+ end
+end
+
+class Array
+ def densities
+ densities = Hash.new { |hash, key| hash[key] = count(key)}
+ Array collect { |x| densities[x] }
+ end
+end

Николай обнови решението на 13.10.2012 18:48 (преди около 12 години)

class Integer
def divides_of? number
self % number == 0
end
def prime?
self > 1 and (2..Math.sqrt(self)).all? { |x| not divides_of? x }
end
def prime_divisors
(2..abs).select { |x| divides_of? x and x.prime? }
end
end
class Range
def fizzbuzz
collect do |x|
if x.kind_of? Integer and (x.divides_of? 3 or x.divides_of? 5)
if x.divides_of? 3 and x.divides_of? 5
:fizzbuzz
elsif x.divides_of? 3
:fizz
else
:buzz
end
else
x
end
end
end
end
class Hash
def group_values
result = Hash.new { |hash, key| hash[key] = [] }
each { |key, value| result[value] << key }
result
end
end
class Array
def densities
- densities = Hash.new { |hash, key| hash[key] = count(key)}
+ densities = Hash.new { |hash, key| hash[key] = count(key) }
Array collect { |x| densities[x] }
end
end
  • collect ти е убииствено сложен като за задачата. Би бил много по-симпатичен с if elsif else
  • Условието не предполага да имаш не-числа в Range. Ако все пак държиш да обработиш и други стойности, аз бих хвърлил грешка за да обърна внимание на потребителя.
  • Защо densities не ти е директно map { |value| count value } а си играеш да минаваш през hash ?
  • divides_of? е тъпо име на метод, понеже "of" не е предлога, който се ползва за делене. Правилното е "divides by". Ако е метод в Ruby divisable_by?. Алтернативно, може да се вместо a.divisable_by? b може b.divides? a.
  • При всички случаи, monkey patch за такива малки методи не е ОК
  • Няма никаква причина да правиш x.kind_of? Integer. Такива проверки по принцип са лоша идея.
  • Ако нещо се дели на 3 и на 5, значи се дели на 15.
  • Array collect { |x| densities[x] } изглежда ужасно. Дори не знам какво си искал да направиш. Защо има Array преди collect? Очевидно работи, обаче какво става ако го махнеш? Защо си го сложил на първо място? Какъвто и да ти е отговора, проверил ли си дали наистина е така?
  • Индентацията ти не е правилна, което ти коства една точка.

Приемам забежките. Все пак не е лесно да започнеш да "мислиш" на Ruby от първата задача и особено ако до сега си се занимавал главно със силно типизирани езици. Идентация от 4 интервала съм възприел от курса по Python, но от сега нататък ще я коригирам на 2 ;)