Петко обнови решението на 20.10.2011 17:32 (преди над 13 години)
+class Array
+ def to_hash
+ Hash[*self.flatten]
+ end
+ def index_by
+ self.map { |value| [yield(value), value] }.to_hash
+ end
+ def subarray_count(sub)
+ m, i = 0, 0
+ until (a = self[i, sub.length]) == []
+ m+=1 if a == sub
+ i+=1
+ end
+ m
+ end
+ def occurences_count
+ hsh = self.uniq.map { |val| [val, self.count(val)] }.to_hash
+ hsh.default = 0
+ hsh
+ end
+end
-
self.
пред всички места на които си го писал е излишен. -
hsh
е много лошо име. Какво му е наhash
? Едва ли този един символ значение - Итерацията ти в
subarray_count
е много сложна. Страда от следните симптоми:- В условието на
until
има присвоянаве. Това може да е ОК в C, но е напълно неприемливо в Ruby. - Няма нужда да ползваш
until
, когато знаеш колко итерации трябва да направиш. Можеше да минеш с0.upto(sub.length) do |i|
, ако не беше видял#each_cons
-
m
иi
са гадни имена на променливи.i
се толерира (някак), ноm
е криптично. Можеше да го кръстиш простоcount
-
sub
е странно име.subarray
щеше да е по-добре. Или простоarray
. С последните две виждаш, че се очаква масив. Съсsub
не знаеш какво да дадеш.
- В условието на