Решение на Първа задача от Илиян Бобев

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

Към профила на Илиян Бобев

Резултати

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

Код

class Integer
def prime_divisors
worknumber, result, div = self.abs, [], 1
while worknumber>1 and div+=1
result << div and worknumber/=div while worknumber%div==0
div = worknumber-1 if div > Math.sqrt(worknumber)
end
result.uniq
end
end
class Range
def fizzbuzz
result = self.collect { |z| (z%3==0 and z%5==0) ? :fizzbuzz : (z%3==0 ? :fizz : (z%5==0 ? :buzz : z)) }
#result = result.each { |z| z.integer? and z%3==0 ? :fizz : z }
#result = result.each { |z| z.integer? and z%5==0 ? :buzz : z }
end
end
class Hash
def group_values
result = {}
self.keys.each { |k| result.has_key?(self[k]) ? result[self[k]]<<k : result[self[k]]=[k] }
result
end
end
class Array
def densities
self.collect { |z| self.count(z) }
end
end

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

........

Finished in 0.00763 seconds
8 examples, 0 failures

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

Илиян обнови решението на 11.10.2012 00:36 (преди около 9 години)

+class Integer
+ def prime_divisors
+ worknumber = self.abs
+ result, div = [],1
+ while worknumber>1 and div+=1
+ result << div and worknumber/=div while worknumber%div==0
+ div = worknumber-1 if div > Math.sqrt(worknumber)
+ end
+ #(2..self).collect { |n| n if ((self/n) * n) == self and n.prime_divisors.len == 1}.compact
+ result.uniq
+ end
+end
+
+class Range
+ def fizzbuzz
+ result = self
+ result.collect do |z|
+ if z%3==0
+ if z%5==0
+ :fizzbuzz
+ else
+ :fizz
+ end
+ elsif z%5==0
+ :buzz
+ else
+ z
+ end
+ end
+ end
+end
+
+class Hash
+ def group_values
+ result = {}
+ self.keys.each do |k|
+ unless result.has_key?(self.fetch(k))
+ result[self.fetch(k)]=[]
+ end
+ result[self.fetch(k)]<<k
+ end
+ result
+ end
+end
+
+class Array
+ def densities
+ self.collect { |z| self.count(z) }
+ end
+end

Илиян обнови решението на 11.10.2012 01:51 (преди около 9 години)

class Integer
def prime_divisors
- worknumber = self.abs
- result, div = [],1
+ worknumber, result, div = self.abs, [], 1
while worknumber>1 and div+=1
result << div and worknumber/=div while worknumber%div==0
div = worknumber-1 if div > Math.sqrt(worknumber)
end
- #(2..self).collect { |n| n if ((self/n) * n) == self and n.prime_divisors.len == 1}.compact
result.uniq
end
end
class Range
def fizzbuzz
- result = self
- result.collect do |z|
- if z%3==0
- if z%5==0
- :fizzbuzz
- else
- :fizz
- end
- elsif z%5==0
- :buzz
- else
- z
- end
- end
+ result = self.collect { |z| (z%3==0 and z%5==0) ? :fizzbuzz : (z%3==0 ? :fizz : (z%5==0 ? :buzz : z)) }
+ #result = result.each { |z| z.integer? and z%3==0 ? :fizz : z }
+ #result = result.each { |z| z.integer? and z%5==0 ? :buzz : z }
end
end
class Hash
def group_values
result = {}
- self.keys.each do |k|
- unless result.has_key?(self.fetch(k))
- result[self.fetch(k)]=[]
- end
- result[self.fetch(k)]<<k
- end
+ self.keys.each { |k| result.has_key?(self[k]) ? result[self[k]]<<k : result[self[k]]=[k] }
result
end
end
class Array
def densities
self.collect { |z| self.count(z) }
end
end
  • prime_divisors е нещо, което е добре да разбиеш на два отделни метода. Стават твърде много неща и трудно се разбира.
  • result във fizzbuzz е излишен.
  • self. е излишен на всички места, на които го ползваш
  • fizzbuzz-а ти е сложен. Трите тернарни оператора са много гадни за четене. По-добре да го беше направил с if/else
  • Коментирания код е проява на лош вкус. Наред с тернарния оператор, двете ще резултират в поне -1 точка в следващи задачи.

OK. fizzbuzz-а първоначално ми беше с if else, но промених всичко заради:
skeptic --methods-per-class 7 --lines-per-method 5 zad1a.rb
Number of lines per method (5)
* Integer#prime_divisors is 6 lines long
* Range#fizzbuzz is 9 lines long
* Hash#group_values is 6 lines long