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

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

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

Резултати

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

Код

class Integer
def prime?
return true if self == 2
(2.. Math.sqrt(self)+2 ).each do |n|
return false if self % n == 0
end
true
end
def prime_divisors
(2..self.abs).collect{ |n| n if (n.prime? && self % n == 0 )}.compact
end
end
class Range
def fizzbuzz
(self).collect do |n|
(n % 3 == 0) ? ((n % 5 == 0) ? :fizzbuzz : :fizz) : ((n % 5 == 0) ? :buzz : n)
end
end
end
class Hash
def group_values
n = Hash.new { |p,k| p[k] = [] }
each {|k,v| n[v] << k}
n
end
end
class Array
def densities
p = Hash.new(0)
self.each { |v| p[v] += 1 }
_arr = []
self.each { |v| _arr << p[v] }
_arr
end
end

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

FF......

Failures:

  1) Integer#prime_divisors can partition a simple number
     Failure/Error: 30.prime_divisors.should eq [2, 3, 5]
       
       expected: [2, 3, 5]
            got: [2, 5]
       
       (compared using ==)
     # /tmp/d20130307-6960-uayhwp/spec.rb:4:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  2) Integer#prime_divisors works with negative numbers
     Failure/Error: (-42).prime_divisors.should eq [2, 3, 7]
       
       expected: [2, 3, 7]
            got: [2, 7]
       
       (compared using ==)
     # /tmp/d20130307-6960-uayhwp/spec.rb:12:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.00824 seconds
8 examples, 2 failures

Failed examples:

rspec /tmp/d20130307-6960-uayhwp/spec.rb:2 # Integer#prime_divisors can partition a simple number
rspec /tmp/d20130307-6960-uayhwp/spec.rb:10 # Integer#prime_divisors works with negative numbers

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

Свилен обнови решението на 13.10.2012 16:00 (преди около 12 години)

+ class Integer
+ def prime?
+ return true if self == 2
+ (2.. Math.sqrt(self)+2 ).each do |n|
+ return false if self % n == 0
+ end
+ true
+ end
+
+ def prime_divisors
+ (2..self.abs).collect{ |n| n if (n.prime? && self % n == 0 )}.compact
+ end
+end
+
+ class Range
+ def fizzbuzz
+ (self).collect do |n|
+ (n % 3 == 0) ? ((n % 5 == 0) ? :fizzbuzz : :fizz) : ((n % 5 == 0) ? :buzz : n)
+ end
+ end
+ end
+
+
+class Hash
+ def group_values
+ n = Hash.new { |p,k| p[k] = [] }
+ each {|k,v| n[v] << k}
+ n
+ end
+end
+
+ class Array
+ def densities
+ p = Hash.new(0)
+ self.each { |v| p[v] += 1 }
+ _arr = []
+ self.each { |v| _arr << p[v] }
+ _arr
+ end
+ end
  • можеш да икономисаш return в prime? като просто ползваш all?/'none? върху Range
  • self на много места ти е излишен
  • На мястото на map {}.compact вероятно си имал предвид просто select
  • Вложен тернарен оператор е нещо, което виждам рядко дори и в C. В подобни случаи е по-разбираемо да си ползваш нормален if.
  • Избягвай такива еднобуквени имена на променливи (дори и когато ти е единствената променлива във функцията) - отнема повече време за прочитане
  • Това което си направил с densities спокойно може да се получи с p.values. Производителността на кода не е ключова цел на курса и в случая е могло в името на четимостта да си ползваш map { |element| count element }, въпреки че е напълно възможно да преброи size пъти абсолютно един и същи елемент.
  • _arr е отвратително име на променлива. Защо с подчертавка отпред? Защо не array? Ако е резултат, защо не result? Хубаво е да се мисли когато се наименоват неща.
  • (self).collect - защо има скоби около self?
  • Вложения тернарен оператор е зло.
  • Защо променливата ти се казва p? Сериозно? Защо p?
  • Идентацията ти и останалия whitespace са много объркани. В резултат, кода ти изглежда мърляв. Това ще ти струва една точка.