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

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

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

Резултати

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

Код

class Integer
def prime_divisors
result = []
(2..self.abs).each do |i|
result<<i if i.prime? and (self % i) == 0
end
result
end
def prime?
(2...self).each do |i|
return false if self % i == 0
end
true
end
end
class Range
def fizzbuzz
result = []
self.each do |i|
if i % 3 == 0 and i % 5 == 0
result<<:fizzbuzz
elsif i % 3 == 0
result<<:fizz
elsif i % 5 == 0
result<<:buzz
else
result<<i
end
end
result
end
end
class Hash
def group_values
result = Hash.new
self.each_pair do |k, v|
result[v] = Array(result[v]) << k
end
result
end
end
class Array
def densities
self.map {|i| self.count(i)}
end
end

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

........

Finished in 0.00737 seconds
8 examples, 0 failures

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

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

+class Integer
+ def prime_divisors
+ result = []
+ (2..self.abs).each do |i|
+ result<<i if i.prime? and (self % i) == 0
+ end
+ result
+ end
+ def prime?
+ (2...self).each do |i|
+ return false if self % i == 0
+ end
+ true
+ end
+end
+
+class Range
+ def fizzbuzz
+ result = []
+ self.each do |i|
+ if i % 3 == 0 and i % 5 == 0
+ result<<:fizzbuzz
+ elsif i % 3 == 0
+ result<<:fizz
+ elsif i % 5 == 0
+ result<<:buzz
+ else
+ result<<i
+ end
+ end
+ result
+ end
+end
+
+class Hash
+ def group_values
+ result = Hash.new
+ self.each_pair do |k, v|
+ result[v] = Array(result[v]) << k
+ end
+ result
+ end
+end
+
+class Array
+ def densities
+ self.map {|i| self.count(i)}
+ end
+end

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

class Integer
def prime_divisors
- result = []
- (2..self.abs).each do |i|
+ result = []
+ (2..self.abs).each do |i|
result<<i if i.prime? and (self % i) == 0
- end
- result
+ end
+ result
end
def prime?
(2...self).each do |i|
- return false if self % i == 0
- end
- true
+ return false if self % i == 0
+ end
+ true
end
end
class Range
def fizzbuzz
result = []
self.each do |i|
if i % 3 == 0 and i % 5 == 0
- result<<:fizzbuzz
+ result<<:fizzbuzz
elsif i % 3 == 0
- result<<:fizz
+ result<<:fizz
elsif i % 5 == 0
- result<<:buzz
+ result<<:buzz
else
- result<<i
+ result<<i
end
end
result
end
end
class Hash
def group_values
result = Hash.new
self.each_pair do |k, v|
result[v] = Array(result[v]) << k
end
- result
+ result
end
end
class Array
def densities
self.map {|i| self.count(i)}
end
end

Като цяло едно не лошо решение. Имам все пак малко коментари:

  • Празните редове са хубаво нещо. Те ни помагат да четем по-лесно програмите. Например добра практика е преди return от метод (явен или не) да има празен ред, както и между методи.

  • За предпочитане е да ползваш 2.upto(self.abs) вместо (2..self.abs). Най-вече заради скобите.

  • Вероятно е можело по-хубаво да се получи следния код:

      result = []
      (2..self.abs).each do |i|
        result<<i if i.prime? and (self % i) == 0
      end
    

ако беше използвал select. Например 2.upto(self.abs).select(&:prime). Това е същото като 2.upto(self.abs).select { |number| number.primer? }, но малко по-красиво като код.

Добре е да си кръщаваш променливите по по-говорящ начин от i.

  • В fizzbuzz може да ползваш map вместо да мутираш. Така е прието и ще е по-лесно четимо.

Благодаря за забележките по задачата. i-то забравих да го променя, понеже в началото написах задачата с for, а там винаги използвам i, но след това погледнах в лекциите, че е много лоша практика и го премахнах :)