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

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

Към профила на Виктор Нонов

Резултати

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

Код

class Integer
def prime_divisors
value = self
value = -self if self < 0
if value < 2
puts "Method is undefined for #{value}"
return
end
divisor = 2
prime_divisors = Array.new
while(divisor <= value) do
if (value.remainder(divisor) == 0)
prime_divisors << divisor if divisor.prime?
end
divisor+=1
end
return prime_divisors.sort
end
def prime?
value = self
value = -value if value < 0
return false if value < 2
divisor = 2
while(divisor < value)
return false if(value.remainder(divisor) == 0)
divisor+=1
end
true
end
end
class Range
def fizzbuzz
a = self.to_a
a.map! { |digit|
digit = case
when (digit.remainder(3) == 0 and digit.remainder(5) == 0) then :fizzbuzz
when digit.remainder(3) == 0 then :fizz
when digit.remainder(5) == 0 then :buzz
else digit
end
}
return a
end
end
puts 21.prime_divisors
puts (1...15).fizzbuzz

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

3
7
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
....FFFF

Failures:

  1) Hash#group_values maps each value to an array of keys
     Failure/Error: {a: 1}.group_values.should eq 1 => [:a]
     NoMethodError:
       undefined method `group_values' for {:a=>1}:Hash
     # /tmp/d20130307-6960-pxxeng/spec.rb:41: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) Hash#group_values takes repetitions into account
     Failure/Error: {a: 1, b: 2, c: 1}.group_values.should eq 1 => [:a, :c], 2 => [:b]
     NoMethodError:
       undefined method `group_values' for {:a=>1, :b=>2, :c=>1}:Hash
     # /tmp/d20130307-6960-pxxeng/spec.rb:45: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)>'

  3) Array#densities maps each element to the number of occurences in the original array
     Failure/Error: [:a, :b, :c].densities.should eq [1, 1, 1]
     NoMethodError:
       undefined method `densities' for [:a, :b, :c]:Array
     # /tmp/d20130307-6960-pxxeng/spec.rb:51: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)>'

  4) Array#densities maps each element to the number of occurences in the original array (again)
     Failure/Error: [].densities.should eq []
     NoMethodError:
       undefined method `densities' for []:Array
     # /tmp/d20130307-6960-pxxeng/spec.rb:57: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.00798 seconds
8 examples, 4 failures

Failed examples:

rspec /tmp/d20130307-6960-pxxeng/spec.rb:40 # Hash#group_values maps each value to an array of keys
rspec /tmp/d20130307-6960-pxxeng/spec.rb:44 # Hash#group_values takes repetitions into account
rspec /tmp/d20130307-6960-pxxeng/spec.rb:50 # Array#densities maps each element to the number of occurences in the original array
rspec /tmp/d20130307-6960-pxxeng/spec.rb:56 # Array#densities maps each element to the number of occurences in the original array (again)

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

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

+class Integer
+ def prime_divisors
+ value = self
+ value = -self if self < 0
+ if value < 2
+ puts "Method is undefined for #{value}"
+ return
+ end
+ divisor = 2
+ prime_divisors = Array.new
+ while(divisor <= value) do
+ if (value.remainder(divisor) == 0)
+ prime_divisors << divisor if divisor.prime?
+ end
+ divisor+=1
+ end
+ return prime_divisors.sort
+ end
+
+ def prime?
+ value = self
+ value = -value if value < 0
+ return false if value < 2
+ divisor = 2
+ while(divisor < value)
+ return false if(value.remainder(divisor) == 0)
+ divisor+=1
+ end
+ true
+ end
+end
+
+class Range
+ def fizzbuzz
+ a = self.to_a
+ a.map! { |digit|
+ digit = case
+ when (digit.remainder(3) == 0 and digit.remainder(5) == 0) then :fizzbuzz
+ when digit.remainder(3) == 0 then :fizz
+ when digit.remainder(5) == 0 then :buzz
+ else digit
+ end
+ }
+ return a
+ end
+end
+
+puts 21.prime_divisors
+puts (1...15).fizzbuzz
  • Идентацията и употребата ти на whitespace не е наред и съгласно предупрежденията ни, ти отнемаме една точка за това; за справка виж ръководството за стил на курса
  • "unbound" цикли в Ruby като while, until и прочее се ползват много рядко — например ако четеш данни по мрежа и не знаеш кога ще свършат; в случаите, в които ти ги ползваш, се предпочитат each, map, select и сродни
  • За ред 3 и 4, 21 и 22 си има метод abs :)
  • Избягвай да ползваш метода puts по начина, по който си го ползвал (за грешки); за тази цел има изключения, за които ще говорим по-натам; в случая, условието не изискваше да покривате тези случаи и работата, която си свършил, е излишна (да не говорим, че не се прави така). Принципно, добре е да се стремиш да не извършваш излишна работа, тъй като повече код = повече проблеми във всяко едно отношение :)
  • Array.new, Hash.new и т.н. никога не се ползват в този си вид (без аргументи); винаги се предпочита литералния синтаксис в тези случаи, т.е. [], {} и прочее
  • Скоби около условието в if, while и прочее не се поставят в Ruby, тъй като са ненужни (не само, че могат да се изпуснат като при методите — просто не се пишат, защото е такъв синтаксисът; това, че можеш да ги напишеш, е просто страничен ефект)
  • В Range#fizzbuzz е било по-подходящо да ползваш if/else, отколкото case; case е подходящ за други ситуации, не когато имаш да оценяваш произволни условия
  • Редове 48 и 49 не е трябвало да ги оставяш в крайното решение, което си предал

Другия път по-добре ;)