Решение на Първа задача от Георги Пачов

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

Към профила на Георги Пачов

Резултати

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

Код

class Integer
def prime_divisors
#work with absolute value only
self_abs = self.abs
result = []
(2..self_abs).each do |k|
if self_abs % k == 0 and k.is_prime?
then result << k
end
end
result
end
#works with positive numbers only, but I will use it only with positives anyway
def is_prime?
if self < 2
return false
end
(2..self-1).each { |lesser_num| return false if self % lesser_num == 0 }
true
end
end
class Range
def fizzbuzz
our_range = self.to_a
result = our_range.map do |number|
if number % 15 == 0
then :fizzbuzz
elsif number % 3 == 0
then :fizz
elsif number % 5 == 0
then :buzz
else
number
end
end
result
end
end
class Hash
def group_values
result = {}
self.each_value do |value|
result[value]=get_keys value
end
result
end
def get_keys(v)
result = select {|key,value| value==v}.keys
result
end
end
class Array
def densities
result = []
self.map do |each_member|
member_density = select { |m| m == each_member }.size
result << member_density
end
result
end
end

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

........

Finished in 0.00724 seconds
8 examples, 0 failures

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

Георги обнови решението на 14.10.2012 12:39 (преди около 12 години)

+class Integer
+ def prime_divisors
+ #work with absolute value only
+ real_self = self.abs
+
+ result = []
+ (2..real_self).each do |k|
+ if (real_self % k == 0) and k.is_prime?
+ then result << k
+ end
+ end
+ result
+ end
+
+ #works with positive numbers only, but I will use it only with positives anyway
+ def is_prime?
+ if self < 2
+ false
+ end
+
+ (2..self-1).each do |k|
+ if (self%k == 0)
+ then return false
+ end
+ end
+ true
+ end
+end
+
+
+
+class Range
+ def fizzbuzz
+ our_range = self.to_a
+ result = []
+ our_range.each do |k|
+ if k% 15 == 0
+ then result << :fizzbuzz
+ elsif k % 3 == 0
+ then result << :fizz
+ elsif k% 5 == 0
+ then result << :buzz
+ else
+ result << k
+ end
+ end
+ result
+ end
+end
+
+
+class Hash
+ def group_values
+ result = {}
+ self.each_value do |value|
+ result[value]=get_keys value
+ end
+ result
+ end
+
+ def get_keys(value)
+ result = []
+ self.each do |key,v|
+ if v == value
+ then result << key
+ end
+ end
+ result
+ end
+end
+
+class Array
+ def densities
+ result = []
+ self.each do |k|
+ density = get_density k
+ result << density
+ end
+ result
+ end
+
+ def get_density(k)
+ density = 0
+ self.each do |t|
+ if t == k
+ then density+=1
+ end
+ end
+ density
+ end
+end
  • self. може и трябва да се изпусне навсякъде, където го ползваш ти, тъй като се подразбира
  • Коментарите ти са излишни в случая; кодът трябва да е достатъчно ясен, за да няма нужда от коментари, а с тази задача това може да се постигне лесно (освен това не отговарят на стила за коментари в style guide-а).
  • На ред 18 не връщаш (нямаш return) и имплементацията на is_prime? ти е бъгава.
  • real_self не е добро име на променлива; защо да е по-real от self? :)
  • На ред 8-ми изпускай скобите около условиет
  • Пробвай да напишеш fizzbuzz и densities с map, вместо с each
  • Когато пишеш if на няколко реда, then винаги се изпуска
  • Пробвай да напишеш get_keys със select
  • t, k и сродни не са добри имена на променливи. Виж това мнение по темата: http://37signals.com/svn/posts/3250-clarity-over-brevity-in-variable-and-method-names

Георги обнови решението на 14.10.2012 22:52 (преди около 12 години)

class Integer
def prime_divisors
#work with absolute value only
- real_self = self.abs
+ self_abs = self.abs
result = []
- (2..real_self).each do |k|
- if (real_self % k == 0) and k.is_prime?
+ (2..self_abs).each do |k|
+ if self_abs % k == 0 and k.is_prime?
then result << k
end
end
result
end
#works with positive numbers only, but I will use it only with positives anyway
def is_prime?
if self < 2
- false
+ return false
end
- (2..self-1).each do |k|
- if (self%k == 0)
- then return false
- end
- end
+ (2..self-1).each { |lesser_num| return false if self % lesser_num == 0 }
+
true
end
end
-
-
class Range
def fizzbuzz
our_range = self.to_a
- result = []
- our_range.each do |k|
- if k% 15 == 0
- then result << :fizzbuzz
- elsif k % 3 == 0
- then result << :fizz
- elsif k% 5 == 0
- then result << :buzz
+ result = our_range.map do |number|
+ if number % 15 == 0
+ then :fizzbuzz
+ elsif number % 3 == 0
+ then :fizz
+ elsif number % 5 == 0
+ then :buzz
else
- result << k
+ number
end
end
result
end
end
-
class Hash
def group_values
result = {}
self.each_value do |value|
result[value]=get_keys value
end
result
end
- def get_keys(value)
- result = []
- self.each do |key,v|
- if v == value
- then result << key
- end
- end
+ def get_keys(v)
+ result = select {|key,value| value==v}.keys
result
end
end
class Array
def densities
result = []
- self.each do |k|
- density = get_density k
- result << density
+ self.map do |each_member|
+ member_density = select { |m| m == each_member }.size
+ result << member_density
end
result
- end
-
- def get_density(k)
- density = 0
- self.each do |t|
- if t == k
- then density+=1
- end
- end
- density
end
end
  • result = е излишно в get_keys, както и във fizzbuzz.
  • Все още имаш излишен self.
  • out_range е невероятно странно име на променлива.
  • Слагай интервали от вътрешната страна на фигурните скоби на хешове - select { |key, value| value == v }. И около оператори.
  • then-а във if-овете няма никаква работа там.