Александър обнови решението на 14.10.2012 21:17 (преди около 12 години)
+class Integer
+ def prime_divisors
+ return [] if self.abs <= 3
+
+ mid = self.abs / 2
+ primes = (2..mid).to_a;
+
+ n = Math.sqrt(primes.length).floor
+ (0..n).each do |i|
+ break unless primes[i]
+ primes = primes.find_all { |curr| curr == primes[i] or curr % primes[i] != 0 }
+ end
+
+ primes.find_all { |curr| self % curr == 0 }
+ end
+end
+
+class Range
+ def fizzbuzz
+ self.to_a.map do |curr|
+ if curr % 3 == 0 and curr % 5 == 0
+ :fizzbuzz
+ elsif curr % 3 == 0
+ :fizz
+ elsif curr % 5 == 0
+ :buzz
+ else
+ curr
+ end
+ end
+ end
+end
+
+class Hash
+ def group_values
+ h = Hash.new { |hash, key| hash[key] = [] }
+ self.each { |k, v| h[v].push k }
+ h
+ end
+end
+
+class Array
+ def densities
+ counters = Hash.new { |hash, key| hash[key] = 0 }
+
+ self.each { |curr| counters[curr] += 1 }
+
+ self.map { |curr| counters[curr] }
+ end
+end
-
curr
иh
са лоши имена на променливи. Нищо няма да ти стане, ако ги кръстишcurrent
иhash
(илиresult
). -
self.
-а на всичките места на които го ползваш е излишен. -
a % 3 == 0 and a % 5 == 0
има по-прост запис :) - Ползвай
select
вместоfind_all
- никой не ползва последното. - В
prime_divisors
всякаш си просиш за допълнителен метод. Ако не ти се monkey patch-ва integer-а още веднъж, можеш да си направиш ламбда.