Решение на Първа задача от Петко Борджуков

Обратно към всички решения

Към профила на Петко Борджуков

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 16 успешни тест(а)
  • 1 неуспешни тест(а)

Код

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

Лог от изпълнението

..F..............

Failures:

  1) Array#to_hash works when the keys and values are arrays
     Failure/Error: [[1, [2, 3]], [[4, 5], 6]].to_hash.should eq(1 => [2, 3], [4, 5] => 6)
       
       expected {1=>[2, 3], [4, 5]=>6}
            got {1=>2, 3=>4, 5=>6}
       
       (compared using ==)
       
       Diff:
       @@ -1,2 +1,2 @@
       -{1=>[2, 3], [4, 5]=>6}
       +{1=>2, 3=>4, 5=>6}
     # /tmp/d20111025-2903-d4jbtq/spec.rb:11:in `block (2 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.01937 seconds
17 examples, 1 failure

Failed examples:

rspec /tmp/d20111025-2903-d4jbtq/spec.rb:10 # Array#to_hash works when the keys and values are arrays

История (1 версия и 1 коментар)

Петко обнови решението на 20.10.2011 17:32 (преди над 12 години)

+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 не знаеш какво да дадеш.