Георги обнови решението на 14.10.2012 20:34 (преди около 12 години)
+class Integer
+ def prime?
+ return true if self == 2
+
+ sqrt_limit = Math.sqrt(self).ceil
+ (2..sqrt_limit).each { |i| return false if self % i == 0 }
+
+ true
+ end
+
+ def prime_divisors
+ x = self.abs
+ return nil if [0, 1].include? x
+
+ divisors = []
+ (2..x).each { |i| divisors.push(i) if x % i == 0 and i.prime? }
+
+ divisors
+ end
+end
+
+class Range
+ def fizzbuzz
+ list = []
+
+ self.each do |n|
+ if n % 15 == 0
+ list.push :fizzbuzz
+ elsif n % 3 == 0
+ list.push :fizz
+ elsif n % 5 == 0
+ list.push :buzz
+ else
+ list.push n
+ end
+ end
+
+ list
+ end
+end
+
+class Hash
+ def group_values
+ hash = Hash.new
+
+ self.each do |key, value|
+ hash[value] = Array.new if hash[value].nil?
+ hash[value].push key
+ end
+
+ hash
+ end
+end
+
+class Array
+ def densities
+ el_count = []
+ self.each { |n| el_count.push self.count(n) }
+
+ el_count
+ end
+end
- Добре подредено решение, харесва ми! :)
- Шаблонът
list = []; ...each { |x| list << x }; list
се наричаmap
и трябва да ползваш него :) Например вdensities
иfizzbuzz
- В
prime_divisors
може пък да ползвашselect
-
self.
е излишно на всички места, на които го ползваш; в такива случаи се изпуска по конвенция -
Array.new
,Hash.new
и т.н. никога не се ползват в този си вид (без аргументи); винаги се предпочита литералния синтаксис в тези случаи, т.е.[]
,{}
и прочее - Предпочитай да ползваш
Array#<<
предArray#push
за добавяне на елементи в списък; т.е.some_list << foo
Благодаря за коментара :) Повечето неща не ги знаех, и за това съм писал така, следващия път по-добре :)
Един въпрос - за функции от типа Math.sqrt() мога ли да избегна ползването на self? Защото sqrt() очевидно очаква аргумент.. може ли да се направи по друг начин?
В случая с Math.sqrt()
не можеш да изпуснеш self
и там си е в реда на нещата да го ползваш.