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

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

Към профила на Елена Денева

Резултати

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

Код

class Integer
def prime?
(2...self).each do |i|
return false if self % i == 0
end
true
end
def prime_divisors
num = abs
numbers = (2..num).select { |i| i.prime? and self % i == 0 }
end
end
class Range
def fizzbuzz
res = map { |i| choose i }
end
def choose(i)
if i % 3 == 0 && i % 5 == 0
:fizzbuzz
elsif i % 3 == 0
:fizz
elsif i % 5 == 0
:buzz
else
i
end
end
end
class Hash
def group_values
hash = Hash.new { |hash, key| hash[key] = [] }
each do |key,value|
hash[value] <<= key
end
hash
end
end
class Array
def densities
counts = map { |item| count(item) }
end
end

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

........

Finished in 0.00742 seconds
8 examples, 0 failures

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

Елена обнови решението на 10.10.2012 23:15 (преди около 12 години)

+class Integer
+ def prime?
+ (2...self).each do |i|
+ return false if self % i == 0
+ end
+ true
+ end
+ def prime_divisors
+ numbers = []
+ num = self.abs
+ (2..num).each do |i|
+ if i.prime? and self % i == 0
+ numbers << i
+ end
+ end
+ numbers
+ end
+end
+class Range
+ def fizzbuzz
+ res = []
+ self.each do |i|
+ el = choose i
+ res << el
+ end
+ res
+ end
+ def choose(i)
+ if i % 3 == 0 && i % 5 == 0
+ :fizzbuzz
+ elsif i % 3 == 0
+ :fizz
+ elsif i % 5 == 0
+ :buzz
+ else
+ i
+ end
+ end
+end
+class Hash
+ def group_values
+ hash = Hash.new{|hash, key| hash[key] = []}
+ self.each do |key,value|
+ hash[value] <<= key
+ end
+ hash
+ end
+end
+class Array
+ def count(n)
+ cnt = 0
+ self.each do |i|
+ if i == n
+ cnt += 1
+ end
+ end
+ cnt
+ end
+ def densities
+ counts = []
+ i = 0
+ self.each do |item|
+ counts[i] = self.count(item)
+ i += 1
+ end
+ counts
+ end
+end

Ето малко коментари:

  • Индентираш с табулации. Това е грубо нарушение на всичко мило и свято. В Ruby се индентира с два интервала. Консултирай се със style guide-а.
  • Monkey patch-а на Array#count е грубо проявление, понеже има метод с такова име. Има и метод, който прави това, което ти трябва.
  • Но повечето места, на които правиш .each, можеш да ползваш map, select или нещо подобно и ще стане по-добре.
  • self. е излишно навсякъде, където го ползваш.

Елена обнови решението на 15.10.2012 10:50 (преди около 12 години)

class Integer
- def prime?
- (2...self).each do |i|
- return false if self % i == 0
- end
- true
- end
- def prime_divisors
- numbers = []
- num = self.abs
- (2..num).each do |i|
- if i.prime? and self % i == 0
- numbers << i
- end
- end
- numbers
- end
+ def prime?
+ (2...self).each do |i|
+ return false if self % i == 0
+ end
+ true
+ end
+ def prime_divisors
+ num = abs
+ numbers = (2..num).select { |i| i.prime? and self % i == 0 }
+ end
end
class Range
- def fizzbuzz
- res = []
- self.each do |i|
- el = choose i
- res << el
- end
- res
- end
- def choose(i)
- if i % 3 == 0 && i % 5 == 0
- :fizzbuzz
- elsif i % 3 == 0
- :fizz
- elsif i % 5 == 0
- :buzz
- else
- i
- end
- end
+ def fizzbuzz
+ res = map { |i| choose i }
+ end
+ def choose(i)
+ if i % 3 == 0 && i % 5 == 0
+ :fizzbuzz
+ elsif i % 3 == 0
+ :fizz
+ elsif i % 5 == 0
+ :buzz
+ else
+ i
+ end
+ end
end
class Hash
- def group_values
- hash = Hash.new{|hash, key| hash[key] = []}
- self.each do |key,value|
- hash[value] <<= key
- end
- hash
- end
+ def group_values
+ hash = Hash.new { |hash, key| hash[key] = [] }
+ each do |key,value|
+ hash[value] <<= key
+ end
+ hash
+ end
end
class Array
- def count(n)
- cnt = 0
- self.each do |i|
- if i == n
- cnt += 1
- end
- end
- cnt
- end
- def densities
- counts = []
- i = 0
- self.each do |item|
- counts[i] = self.count(item)
- i += 1
- end
- counts
- end
+ def densities
+ counts = map { |item| count(item) }
+ end
end

Добре, супер. Ето няколко коментара.

  • Добре е да оставяш по един празен ред между класовете и методите.
  • prime? е записан по-много сложен начин. Може да ползваш any?.
  • В prime_divisors нямаш нужда нито от num, нито от numbers.
  • Това да добавиш метод choose в Range е мнооогооо лоша идея. Първо няма никакъв смисъл за области, които нямат нищо общо с fizzbuzz и второ защото няма нищо общо с Range - ако е някъде, трябва да е в Integer.
  • i % 3 == 0 && and i % 5 == 0 се записва като i % 15 == 0.
  • Този оператор <<= си го измисли отнякъде. << стига.
  • counts в Array#densities също е ненужна променлива.