Чанита обнови решението на 14.10.2012 16:40 (преди около 12 години)
+class Integer
+ def prime?(n)
+ return true if n == 2
+
+ (2..Integer(Math.sqrt(n))).each do |x|
+ return false if n % x == 0
+ end
+
+ return true
+ end
+
+ def prime_divisors
+ selfabs = abs
+ list = []
+
+ (2..selfabs).each do |x|
+ break if x > selfabs
+ if selfabs % x == 0 && prime?(x)
+ list = list | [x]
+ selfabs /= x
+ end
+ end
+
+ list
+ end
+
+end
+class Range
+
+ def fizzbuzz
+ i = -1
+ list = []
+
+ each do |x|
+ i += 1
+ list[i] = if x % 3 == 0 and x % 5 == 0 then :fizzbuzz
+ elsif x % 3 == 0 then :fizz
+ elsif x % 5 == 0 then :buzz
+ else x
+ end
+ end
+
+ list
+ end
+
+end
+
+class Hash
+
+ def group_values
+ hsh=Hash.new(nil)
+
+ each do |key, value|
+
+ if hsh[value] == nil
+ hsh[value] = [key]
+ next
+ end
+
+ hsh[value] += [key]
+ end
+
+ hsh
+ end
+
+end
+
+
+class Array
+
+ def densities
+ list = []
+ hsh=Hash.new(0)
+
+ each do |x|
+
+ if hsh[x] == 0
+ hsh[x] = 1
+ next
+ end
+
+ hsh[x] += 1
+ end
+
+ each {|x| list += [hsh[x]]}
+
+ list
+ end
+
+end
-
selfabs
иhsh
са лоши имена. Ако помня правилно, беше на лекцията и чу защо. -
(x..y).each
е по-добре катоx.upto(y) do
. - Впрочем, конвертирането до цяло число става с метода
to_i
, а не с подаване на методаInteger
(учудващо, ноInteger
в този случай е метод). -
Hash.new(nil)
е учудващо страннен начин да запишеш{}
-
hash[value] == nil
се записва катоhash[value].nil?
или в твоя случай, самоhash[value]
. - Когато имаш
each
сnext
си струва да видиш дали кода няма да стане по-разбираем, ако премахнешnext
-а. В случая наgroup_values
, ще бъде по-добре ако останалата част от цикъла е вelse
-а, отколкото ако излизаш преждевременно сnext
.