Гергана обнови решението на 13.10.2012 20:34 (преди около 12 години)
+class Integer
+ def prime?
+ (1...self.abs).inject { |a,b| a*b } % self.abs == self.abs-1
+ end
+
+ def prime_divisors
+ (2..self.abs).select { |i| self.abs % i == 0 and i.prime? }.sort
+ end
+end
+
+class Range
+ def fizzbuzz
+ self.to_a.map do |n|
+ if n % 15 == 0
+ :fizzbuzz
+ elsif n % 3 == 0
+ :fizz
+ elsif n % 5 == 0
+ :buzz
+ else
+ n
+ end
+ end
+ end
+end
+
+class Hash
+ def keys_for(value)
+ self.to_a.select { |k,v| v == value }.map { |k, v| k }
+ end
+
+ def group_values
+ Hash[self.values.uniq.map { |value| [value, keys_for(value)] }]
+ end
+end
+
+class Array
+ def densities
+ self.map { |element| count(element) }
+ end
+end
- Нямаш причина да ползваш
self.
-
self.to_a.map
е ненужно дълъг начин да направишmap
(важи и заselect
/values
) - Малко странно ми стои конструирането в
group_values
. Може би ще изглежда по-приятно с някакъвinject
по същия уникален масив от стойности. -
self.map { |element| count(element) }
няма нужда от()
околоelement
- Хаха.
Integer#prime?
ме забавлява, но не мога да осмисля дали е правилно. Това някаква теорема ли беше? - Харесва ми идеята функционалния стил в
Hash
, но не и начина по който си го направила. Кода щеше да е по-прост, ако беше по-тривиален. - Не съм сигурен защо сортираш числата в
Integer#prime_divisors
. Струва ми се, че ще бъдат подредени във възходящ ред. - Можеш да направиш
inject(:*)
вместо да подаваш блок.
- Да, теорема е :) http://en.wikipedia.org/wiki/Wilson%27s_theorem
- За хеш, разгледах други решения и видях много по-хубави и ясни начини, но не се сетих, когато го пишех. :))