Решение на Първа задача от Диляна Тодорова

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

Към профила на Диляна Тодорова

Резултати

  • 5 точки от тестове
  • 0 бонус точки
  • 5 точки общо
  • 15 успешни тест(а)
  • 2 неуспешни тест(а)

Код

class Array
def to_hash
inject({}) {|hash_result, (key,value)| hash_result[key] = value; hash_result}
end
def index_by
inject({}) {|h, el| h[yield el] = el; h}
end
def subarray_count(other_array)
csubarray = 0
subarray_length = other_array.length
self_length = self.length;
len = self_length - subarray_length
if self_length - subarray_length < 0 then
return 0
end
for current_index in 0..len
if self.slice(current_index,subarray_length).eql?(other_array) then
csubarray += 1
end
end
return csubarray
end
def occurences_count
inject({}) {|hash_result,element| hash_result[element] = self.count(element); hash_result}
end
end

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

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

Failures:

  1) Array#occurences_count returns a hash that defaults to 0 when the key is not present
     Failure/Error: [].occurences_count[:something].should eq 0
       
       expected 0
            got nil
       
       (compared using ==)
     # /tmp/d20111025-2903-oz1fqz/spec.rb:74: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)>'

  2) Array#occurences_count returns a hash, that does not change when indexed with a non-occuring element
     Failure/Error: hash['b'].should eq 0
       
       expected 0
            got nil
       
       (compared using ==)
     # /tmp/d20111025-2903-oz1fqz/spec.rb:84: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.01384 seconds
17 examples, 2 failures

Failed examples:

rspec /tmp/d20111025-2903-oz1fqz/spec.rb:73 # Array#occurences_count returns a hash that defaults to 0 when the key is not present
rspec /tmp/d20111025-2903-oz1fqz/spec.rb:81 # Array#occurences_count returns a hash, that does not change when indexed with a non-occuring element

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

Диляна обнови решението на 23.10.2011 21:31 (преди над 12 години)

+class Array
+ def to_hash
+ inject({}) {|hash_result, (key,value)| hash_result[key] = value; hash_result}
+ end
+ def index_by
+ inject({}) {|h, el| h[yield el] = el; h}
+ end
+ def subarray_count(other_array)
+ csubarray = 0
+ subarray_length = other_array.length
+ self_length = self.length;
+ len = self_length - subarray_length
+ if self_length - subarray_length < 0 then
+ return 0
+ end
+ for current_index in 0..len
+ if self.slice(current_index,subarray_length).eql?(other_array) then
+ csubarray += 1
+ end
+ end
+ return csubarray
+ end
+ def occurences_count
+ inject({}) {|hash_result,element| hash_result[element] = self.count(element); hash_result}
+ end
+end
  • Оставяй по един празен ред между дефинициите на методи в клас
  • По конвенция, едноредовите блокове с къдрави скоби имат интервали около скобите така: sth { |args| code }
  • Излишните неща в Ruby не са на почит; излишно е да се ползва then с if, когато тялото на if-а е на следващия ред
  • for е зло — ако си била на последните лекции, със сигурност вече знаеш :) Ако не — ползвай Enumerable#each; ползва се в 95% процента от случаите; в останалите, свързани с енумериране на потоци с неизвестен край (например мрежови потоци), се ползват while/until/loop, но не и for :) С две думи: for — никога
  • Пропускай експлицитния return, когато не е нужен; например в края на функцията, за да върнеш стойността на променливата csubarray, напиши просто csubarray
  • И като стана дума, що за име е csubarray? :) Нещо по-обикновено би било доста по-добре, например subarray_count; по-голямата дължина на името не е непременно лошо нещо
  • Всъщност, каквато и конвенция да избере човек, трябва да я спазва консистентно; няма по-лошо нещо от неконсистентен код; код с лоша конвенция е по-добър отколкото код с никаква; в случая визирам subarray_length, което е кръстено добре, но пък не в тон с предишна конвенция; очаквах да видя lsubarray :))
  • Като цяло, струва ми се, че в subarray_count има малко излишни променливи и малко излишен код; например, интересно ми е защо правиш променлива len и на следващия ред, в if-а смяташ същия израз отново :)

Ако все още не си, разгледай решенията на колегите си. Може да видиш и примерното решение на Стефан, което не е лошо :))