Решение на Първа задача от Петър Костов

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

Към профила на Петър Костов

Резултати

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

Код

class Integer
def prime_divisors
(2..abs).select do |n|
(2..Math.sqrt(n)).none? { |d| n % d == 0 } and self % n == 0
end
end
end
class Range
def fizzbuzz
map do |number|
result = ""
result << "fizz" if number % 3 == 0
result << "buzz" if number % 5 == 0
result.empty? ? number : result.to_sym
end
end
end
class Hash
def group_values
result = Hash.new { |hash, key| hash[key] = [] }
each { |key, value| result[value] << key }
result
end
end
class Array
def densities
map do |element|
select { |selected| selected == element }.count
end
end
end

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

........

Finished in 0.00823 seconds
8 examples, 0 failures

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

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

+class Integer
+ def prime_divisors
+ (2..abs).select { |n| (2..Math.sqrt(n)).none? { |d| n % d == 0 } and self % n == 0 }
+ end
+end
+
+class Range
+ def fizzbuzz
+ (min..max).map do |number|
+ result = ""
+ result << "fizz" if number % 3 == 0
+ result << "buzz" if number % 5 == 0
+ if result.empty? then number else result.to_sym end
+ end
+ end
+end
+
+class Hash
+ def group_values
+ result = Hash.new { |hash, key| hash[key] = [] }
+ each { |key, value| result[value] << key }
+ result
+ end
+end
+
+class Array
+ def densities
+ map { |elem| select { |selected| selected == elem }.count }
+ end
+end
  • На 13-ти ред може би тернарният оператор ще дойде по-добре. Или поне направи този if/else на няколко реда.
  • На 9-ти ред няма нужда от този (min..max). Не разбирам каква му е идеята. Може просто да извикаш Range#map... Вж. документацията или го пробвай в irb.
  • Слагай малко повечко нови редове, по-добре ще се чете. Две вложени итерации с къдрави скоби на един ред е повече, отколкото трябва.
  • Ред 20-ти се ползва понякога (идиом е), но пък и има страничния ефект, че връщания резултат има особено свойство и ако човек поиска несъществуващ ключ, ще получи празен списък. По-добре избягвай да връщаш такива "особени" хешове.

Петър обнови решението на 13.10.2012 19:00 (преди около 12 години)

class Integer
+
def prime_divisors
- (2..abs).select { |n| (2..Math.sqrt(n)).none? { |d| n % d == 0 } and self % n == 0 }
+ (2..abs).select do |n|
+ (2..Math.sqrt(n)).none? { |d| n % d == 0 } and self % n == 0
+ end
end
+
end
class Range
+
def fizzbuzz
- (min..max).map do |number|
+ map do |number|
result = ""
result << "fizz" if number % 3 == 0
result << "buzz" if number % 5 == 0
- if result.empty? then number else result.to_sym end
+ result.empty? ? number : result.to_sym
end
end
+
end
class Hash
+
def group_values
- result = Hash.new { |hash, key| hash[key] = [] }
+ result = Hash.new { |hash, key| hash[key] = [] }
each { |key, value| result[value] << key }
result
end
+
end
class Array
+
def densities
- map { |elem| select { |selected| selected == elem }.count }
+ map do |element|
+ select { |selected| selected == element }.count
+ end
end
+
end

Много добре. Получаваш една бонус точка. Ето няколко коментара.

  • Няма нужда да оставаш празен ред след началото и преди края на реда. Даже е лоша идея.
  • Конструирането на низ по такъв начин във fizzbuzz е гадно. Прави кода по-труден за четене. По-добре е просто да имаш условие с четири възможност.
  • Разгледай #count. Ще откриеш, че го ползваш по лимитиращ начин. Можеш да опростиш densities.