Решение на Първа задача от Михаил Петков

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

Към профила на Михаил Петков

Резултати

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

Код

require 'mathn'
class Integer
def prime_divisors
array = []
(2..self).to_a.each {|n| array << n if is_prime(n) && self % n == 0}
array
end
def is_prime number
i = 2
while i < number / 2
if number % i == 0 then return false else i += 1 end
end
return true
end
end
class Range
def fizzbuzz
self.to_a.map! {|x| if x%3 == 0 && x%5 == 0 then :fizzbuzz elsif x%3 == 0 then :fizz elsif x%5 == 0 then :buzz else x end}
end
end
class Array
def densities
self.inject([]){|array, elements| array << self.select{ |current_element| current_element == elements }.size }
end
end
class Hash
def group_values
values = Hash.new {|h,k| h[k] = []}
each {|k,v| values[v] << k}
values
end
end

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

FF......

Failures:

  1) Integer#prime_divisors can partition a simple number
     Failure/Error: 4.prime_divisors.should eq [2]
       
       expected: [2]
            got: [2, 4]
       
       (compared using ==)
     # /tmp/d20130307-6960-xs7kr8/spec.rb:6: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: (-10).prime_divisors.should eq [2, 5]
       
       expected: [2, 5]
            got: []
       
       (compared using ==)
     # /tmp/d20130307-6960-xs7kr8/spec.rb:11: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.01882 seconds
8 examples, 2 failures

Failed examples:

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

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

Михаил обнови решението на 13.10.2012 18:46 (преди около 12 години)

+require 'mathn'
+
+class Integer
+ def prime_divisors
+ array = []
+ (2..self).to_a.each {|n| array << n if is_prime(n) && self % n == 0}
+ array
+ end
+
+ def is_prime number
+ i = 2
+ while i < number / 2
+ if number % i == 0 then return false else i += 1 end
+ end
+ return true
+ end
+end
+
+class Range
+ def fizzbuzz
+ self.to_a.map! {|x| if x%3 == 0 && x%5 == 0 then :fizzbuzz elsif x%3 == 0 then :fizz elsif x%5 == 0 then :buzz else x end}
+ end
+end
+
+class Array
+ def densities
+ self.inject([]){|array, elements| array << self.select{ |current_element| current_element == elements }.size }
+ end
+end
+
+class Hash
+ def group_values
+ values = Hash.new {|h,k| h[k] = []}
+ each {|k,v| values[v] << k}
+ values
+ end
+end
  • (2..self).to_a.each няма нужда от to_a. За по-четливо се възприема 2.upto(self). Като цяло тук си имал предвид select.
  • Слагай си по-смислени имена на променливите
  • Нямаш смислена причина да използваш self.
  • self.to_a.map! е малко странен начин да напишеш map. На същото място ще изглежда по-добре да го направиш на няколко реда.
  • select {}.size е доста дълъг начин да напишеш count. В същия ред на мисли, inject в тази ситуация би изглеждал по-добре като map
  • Какво прави този require там горе? Не го ползваеш?
  • Каквото Иван каза.
  • Не спазваш конвенциите. Най-вече, не идентираш с два интервала, което за тази задача струва точки.
  • Кодът на 21 ред е ужасно труден за четене. Трябваше да го напишеш на няколко реда
  • Добавянето на такъв метод is_prime в Integer е глупаво, но за това ще си говорим в сряда.
  • Това в prime_divisors трябва да е select, а не each