Петър обнови решението на 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-ти се ползва понякога (идиом е), но пък и има страничния ефект, че връщания резултат има особено свойство и ако човек поиска несъществуващ ключ, ще получи празен списък. По-добре избягвай да връщаш такива "особени" хешове.