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

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

Към профила на Виктория Христова

Резултати

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

Код

class Integer
def prime?
2.upto(self-1).all? { |a| self.remainder(a).nonzero? }
end
def prime_divisors
arr = []
positive = self.abs
(2..positive).each do |num|
num.prime? and positive % num == 0 and arr.push(num)
end
arr
end
end
class Range
def divisible_by(step)
remainder = self.first % step
remainder = step if remainder == 0
num = self.last - self.first
list = (0..num).select { |n| n % step == step - remainder }
list
end
def fizzbuzz
arr = self.select { |n| n }
divisible_by(3).each { |elem| arr[elem] = :fizz }
divisible_by(5).each { |elem| arr[elem] = :buzz }
divisible_by(15).each { |elem| arr[elem] = :fizzbuzz }
arr
end
end
class Hash
def group_values
h = {}
self.each_value do |value|
h[value] = self.keys.select { |n| self[n] == value }
end
h
end
end
class Array
def densities
arr = []
number=self.length
(0..number-1).each do |elem|
arr[elem] = self.find_all { |n| n == self[elem] }.length
end
arr
end
end

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

...F....

Failures:

  1) Range#fizzbuzz works with tricky ranges
     Failure/Error: (15...15).fizzbuzz.should eq []
       
       expected: []
            got: [:fizzbuzz]
       
       (compared using ==)
       
       Diff:
       @@ -1,2 +1,2 @@
       -[]
       +[:fizzbuzz]
     # /tmp/d20130307-6960-1nzm4pi/spec.rb:35: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.01053 seconds
8 examples, 1 failure

Failed examples:

rspec /tmp/d20130307-6960-1nzm4pi/spec.rb:32 # Range#fizzbuzz works with tricky ranges

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

Виктория обнови решението на 14.10.2012 17:09 (преди около 12 години)

+class Integer
+
+ def prime?
+ 2.upto(self-1).all? { |a| self.remainder(a).nonzero? }
+ end
+
+ def prime_divisors
+ arr = []
+ positive = self.abs
+ (2..positive).each do |num|
+ num.prime? and positive % num == 0 and arr.push(num)
+ end
+ arr
+ end
+
+end
+
+
+class Range
+
+ def divisible_by(step)
+ remainder = self.first % step
+ remainder = step if remainder == 0
+ num = self.last - self.first
+ list = (0..num).select { |n| n % step == step - remainder }
+ list
+ end
+
+
+ def fizzbuzz
+ arr = self.select { |n| n }
+ divisible_by(3).each { |elem| arr[elem] = :fizz }
+ divisible_by(5).each { |elem| arr[elem] = :buzz }
+ divisible_by(15).each { |elem| arr[elem] = :fizzbuzz }
+ arr
+ end
+
+end
+
+
+class Hash
+
+ def group_values
+ h = {}
+ self.each_value do |value|
+ h[value] = self.keys.select { |n| self[n] == value }
+ end
+ h
+ end
+
+end
+
+
+class Array
+
+ def densities
+ arr = []
+ number=self.length
+ (0..number-1).each do |elem|
+ arr[elem] = self.find_all { |n| n == self[elem] }.length
+ end
+ arr
+ end
+
+end
  • Мутацията на arr на 11 ред не е много приятна. Ако имаш страничен ефект, добре е да не го зариваш толкова навътре в кода си. По-скоро if, бил той нормален или постфиксен.
  • divisable_by трябваше да се казва divisable_by?
  • arr = select { |n| n } е доста странна конструкция. Предполагам си искала да направиш копие на масива. Това става с Object#dup. По-добре ще е вместо да мутираш, да направиш map.
  • select е далеч по-популярния синоним на find_all.
  • Няма нужда да итерираш 0..number-1 - можеш просто да направиш #each.