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

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

Към профила на Валентин Гелински

Резултати

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

Код

class Integer
def get_divisors
divisors = []
possible_divisors = *(1..Math.sqrt(self))
possible_divisors.each do |n|
if self % n == 0
divisors << n
divisors << self / n
end
end
divisors
end
def is_prime?
self != 1 && [1, self] == self.get_divisors
end
def prime_divisors
if self < 0 { return (0 -1).prime_divisors }
divisors = self.get_divisors
prime_divisors = []
divisors.each { |divisor| prime_divisors << divisor if divisor.is_prime?}
prime_divisors
end
end
class Range
def fizzbuzz
fizzbuzz_array = []
self.to_a.each do |n|
next_member = n
next_member = :fizz if n % 3 == 0
next_member = :buzz if n % 5 == 0
#Important! next line shoud be the last check, do not move it up!
next_member = :fizzbuzz if n % 15 == 0
fizzbuzz_array << next_member
end
fizzbuzz_array
end
end
class Hash
def group_values
ret = {} #empty Hash
self.each do |key, value|
if ret.has_key? value
ret[value] << key
else
#tmp used for debugging reasons, no other sence
tmp = {value => [key]}
ret = ret.merge(tmp)
end
end
ret
end
end
class Array
def densities
holder = {} #emoty hash
self.each do |n|
if holder.has_key? n
#increment with one
count = holder[n]
holder[n] = count + 1
else
#put in holder with value of one
holder = holder.merge({n => 1})
end
end
ret = [] #empty array
self.each { |n| ret << holder[n]}
ret
end
end

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

/data/rails/evans-2012/shared/bundled_gems/ruby/1.9.1/gems/rspec-core-2.11.0/lib/rspec/core/configuration.rb:434:in `require': /tmp/d20130307-6960-12tl4cm/solution.rb:19: syntax error, unexpected '{', expecting keyword_then or ';' or '\n' (SyntaxError)
    if self < 0 { return (0 -1).prime_divisors }
                 ^
/tmp/d20130307-6960-12tl4cm/solution.rb:19: syntax error, unexpected '}', expecting keyword_end
    if self < 0 { return (0 -1).prime_divisors }
                                                ^
	from /data/rails/evans-2012/shared/bundled_gems/ruby/1.9.1/gems/rspec-core-2.11.0/lib/rspec/core/configuration.rb:434:in `block in requires='
	from /data/rails/evans-2012/shared/bundled_gems/ruby/1.9.1/gems/rspec-core-2.11.0/lib/rspec/core/configuration.rb:434:in `map'
	from /data/rails/evans-2012/shared/bundled_gems/ruby/1.9.1/gems/rspec-core-2.11.0/lib/rspec/core/configuration.rb:434:in `requires='
	from /data/rails/evans-2012/shared/bundled_gems/ruby/1.9.1/gems/rspec-core-2.11.0/lib/rspec/core/configuration_options.rb:20:in `block in configure'
	from /data/rails/evans-2012/shared/bundled_gems/ruby/1.9.1/gems/rspec-core-2.11.0/lib/rspec/core/configuration_options.rb:19:in `each'
	from /data/rails/evans-2012/shared/bundled_gems/ruby/1.9.1/gems/rspec-core-2.11.0/lib/rspec/core/configuration_options.rb:19:in `configure'
	from /data/rails/evans-2012/shared/bundled_gems/ruby/1.9.1/gems/rspec-core-2.11.0/lib/rspec/core/command_line.rb:21:in `run'
	from /data/rails/evans-2012/shared/bundled_gems/ruby/1.9.1/gems/rspec-core-2.11.0/lib/rspec/core/runner.rb:69:in `run'
	from /data/rails/evans-2012/shared/bundled_gems/ruby/1.9.1/gems/rspec-core-2.11.0/lib/rspec/core/runner.rb:8:in `block in autorun'

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

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

+class Integer
+ def get_divisors
+ divisors = []
+ possible_divisors = *(1..Math.sqrt(self))
+ possible_divisors.each do |n|
+ if self % n == 0
+ divisors << n
+ divisors << self / n
+ end
+ end
+ divisors
+ end
+
+ def is_prime?
+ self != 1 && [1, self] == self.get_divisors
+ end
+
+ def prime_divisors
+ divisors = self.get_divisors
+ prime_divisors = []
+ divisors.each { |divisor| prime_divisors << divisor if divisor.is_prime?}
+ prime_divisors
+ end
+end
+
+class Range
+ def fizzbuzz
+ fizzbuzz_array = []
+ self.to_a.each do |n|
+ next_member = n
+ next_member = :fizz if n % 3 == 0
+ next_member = :buzz if n % 5 == 0
+ #Important! next line shoud be the last check, do not move it up!
+ next_member = :fizzbuzz if n % 15 == 0
+ fizzbuzz_array << next_member
+ end
+ fizzbuzz_array
+ end
+end
+
+class Hash
+ def group_values
+ ret = {} #empty Hash
+ self.each do |key, value|
+ if ret.has_key? value
+ ret[value] << key
+ else
+ #tmp used for debugging reasons, no other sence
+ tmp = {value => [key]}
+ ret = ret.merge(tmp)
+ end
+ end
+ ret
+ end
+end
+
+class Array
+ def densities
+ holder = {} #emoty hash
+ self.each do |n|
+ if holder.has_key? n
+ #increment with one
+ count = holder[n]
+ holder[n] = count + 1
+ else
+ #put in holder with value of one
+ holder = holder.merge({n => 1})
+ end
+ end
+ ret = [] #empty array
+ self.each { |n| ret << holder[n]}
+ ret
+ end
+end

Валентин обнови решението на 15.10.2012 16:48 (преди около 12 години)

class Integer
def get_divisors
divisors = []
possible_divisors = *(1..Math.sqrt(self))
possible_divisors.each do |n|
if self % n == 0
divisors << n
divisors << self / n
end
end
divisors
end
def is_prime?
self != 1 && [1, self] == self.get_divisors
end
def prime_divisors
+ if self < 0 { return (0 -1).prime_divisors }
divisors = self.get_divisors
prime_divisors = []
divisors.each { |divisor| prime_divisors << divisor if divisor.is_prime?}
prime_divisors
end
end
class Range
def fizzbuzz
fizzbuzz_array = []
self.to_a.each do |n|
next_member = n
next_member = :fizz if n % 3 == 0
next_member = :buzz if n % 5 == 0
#Important! next line shoud be the last check, do not move it up!
next_member = :fizzbuzz if n % 15 == 0
fizzbuzz_array << next_member
end
fizzbuzz_array
end
end
class Hash
def group_values
ret = {} #empty Hash
self.each do |key, value|
if ret.has_key? value
ret[value] << key
else
#tmp used for debugging reasons, no other sence
tmp = {value => [key]}
ret = ret.merge(tmp)
end
end
ret
end
end
class Array
def densities
holder = {} #emoty hash
self.each do |n|
if holder.has_key? n
#increment with one
count = holder[n]
holder[n] = count + 1
else
#put in holder with value of one
holder = holder.merge({n => 1})
end
end
ret = [] #empty array
self.each { |n| ret << holder[n]}
ret
end
end
  • possible_divisors не ти е нужно като обект. С чиста съвест можеш да си each-ваш върху Range
  • В конкретния слчуай може би си имал предвид (1..self).select { |number| self % number == 0 }, като 1.upto(self) би било дори още по-добре
  • Нямаш нужда от self.
  • Не съм сигурен какво си имал предвид с if self < 0 { return (0 -1).prime_divisors } (може би си искал да бъде if self < 0 { return (abs).prime_divisors }
  • Със сигурност след това си искал да постигнеш divisors.select
  • Във fizbuzz си имал желание да направиш map и вероятно да ползваш if .. elsif .. else
  • tmp/ret бих ги написал като temp/result (например) в Ruby

      tmp = {value => [key]}
      ret = ret.merge(tmp)
    

Вероятно е трябвало да бъде просто

    ret[value] = key

Нямаш нужда от нов Hash и merge

  • За holder = holder.merge({n => 1}) важи абсолютно същото нещо

      count = holder[n]
      holder[n] = count + 1
    

Спокойно може да бъде holder[number] += 1, като в този метод също си искал да направиш map и да минеш с 2 реда по-малко

  • Имената ти са лоши. next_member не е "следващия елемент", а е текущия. holder също не значи нищо смиселно. fizzbuzz_array можеше да се казва result.
  • holder.merge({n => 1}) е уникално глупав начин да напишеш holder[n] = 1. Как ти хрумна?
  • Кода в fizzbuzz е много неприятно подреден. Че реда има значение, но няма никаква причина да оценяваш второто условие, ако знаеш, че първото е истина. Трябваше да направиш едно if/elsif/elsif/else условие.
  • На места е трябвало да ползваш map, но си ползвал each.
  • Кода ти е много неидиоматичен и не прилича на Ruby. Разгледай малко други решения.

Ще ти взема една точка заради всичките тези неща. Отделно, убеден съм, че не си пуснал примерния тест.