Решение на Първа задача от Владимир Ценев

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

Към профила на Владимир Ценев

Резултати

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

Код

class Array
def to_hash
result = Hash.new
self.each do |element|
if element.kind_of?(Array) and element.length == 2
result.store(element[0], element[1])
else
puts "Array is not a list of pairs."
return
end
end
result
end
end

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

.....FFFFFFFFFFFF

Failures:

  1) Array#index_by indexes the array elemens by a block
     Failure/Error: ['John Coltrane', 'Miles Davis'].index_by { |name| name.split(' ').last }.should eq('Coltrane' => 'John Coltrane', 'Davis' => 'Miles Davis')
     NoMethodError:
       undefined method `index_by' for ["John Coltrane", "Miles Davis"]:Array
     # /tmp/d20111025-2903-1i7631y/spec.rb:33: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#index_by takes the last element when multiple elements evaluate to the same key
     Failure/Error: [11, 21, 31, 41].index_by { |n| n % 10 }.should eq(1 => 41)
     NoMethodError:
       undefined method `index_by' for [11, 21, 31, 41]:Array
     # /tmp/d20111025-2903-1i7631y/spec.rb:37: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)>'

  3) Array#index_by works on empty arrays
     Failure/Error: [].index_by { |n| :something }.should eq({})
     NoMethodError:
       undefined method `index_by' for []:Array
     # /tmp/d20111025-2903-1i7631y/spec.rb:41: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)>'

  4) Array#index_by works with false and nil keys
     Failure/Error: [nil, false].index_by { |n| n }.should eq(nil => nil, false => false)
     NoMethodError:
       undefined method `index_by' for [nil, false]:Array
     # /tmp/d20111025-2903-1i7631y/spec.rb:45: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)>'

  5) Array#subarray_count(subarray) counts the number of times the argument is present as a sub-array
     Failure/Error: [1, 1, 2, 1, 1, 1].subarray_count([1, 1]).should eq 3
     NoMethodError:
       undefined method `subarray_count' for [1, 1, 2, 1, 1, 1]:Array
     # /tmp/d20111025-2903-1i7631y/spec.rb:51: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)>'

  6) Array#subarray_count(subarray) works with arrays with non-numeric keys
     Failure/Error: %w[a b c b c].subarray_count(%w[b c]).should eq 2
     NoMethodError:
       undefined method `subarray_count' for ["a", "b", "c", "b", "c"]:Array
     # /tmp/d20111025-2903-1i7631y/spec.rb:55: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)>'

  7) Array#subarray_count(subarray) work with empty arrays
     Failure/Error: [].subarray_count([1]).should be_zero
     NoMethodError:
       undefined method `subarray_count' for []:Array
     # /tmp/d20111025-2903-1i7631y/spec.rb:59: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)>'

  8) Array#subarray_count(subarray) work when the argument is larger than the array
     Failure/Error: [1].subarray_count([1, 2]).should eq 0
     NoMethodError:
       undefined method `subarray_count' for [1]:Array
     # /tmp/d20111025-2903-1i7631y/spec.rb:63: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)>'

  9) Array#occurences_count counts how many times an element is present in an array
     Failure/Error: [:foo, :bar, :foo].occurences_count.should eq(foo: 2, bar: 1)
     NoMethodError:
       undefined method `occurences_count' for [:foo, :bar, :foo]:Array
     # /tmp/d20111025-2903-1i7631y/spec.rb:69: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)>'

  10) Array#occurences_count returns a hash that defaults to 0 when the key is not present
     Failure/Error: [].occurences_count[:something].should eq 0
     NoMethodError:
       undefined method `occurences_count' for []:Array
     # /tmp/d20111025-2903-1i7631y/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)>'

  11) Array#occurences_count works with arrays containing nil and false
     Failure/Error: [nil, false, nil, false, true].occurences_count.should eq(nil => 2, false => 2, true => 1)
     NoMethodError:
       undefined method `occurences_count' for [nil, false, nil, false, true]:Array
     # /tmp/d20111025-2903-1i7631y/spec.rb:78: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)>'

  12) Array#occurences_count returns a hash, that does not change when indexed with a non-occuring element
     Failure/Error: hash = %w[a a].occurences_count
     NoMethodError:
       undefined method `occurences_count' for ["a", "a"]:Array
     # /tmp/d20111025-2903-1i7631y/spec.rb:82: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.01609 seconds
17 examples, 12 failures

Failed examples:

rspec /tmp/d20111025-2903-1i7631y/spec.rb:32 # Array#index_by indexes the array elemens by a block
rspec /tmp/d20111025-2903-1i7631y/spec.rb:36 # Array#index_by takes the last element when multiple elements evaluate to the same key
rspec /tmp/d20111025-2903-1i7631y/spec.rb:40 # Array#index_by works on empty arrays
rspec /tmp/d20111025-2903-1i7631y/spec.rb:44 # Array#index_by works with false and nil keys
rspec /tmp/d20111025-2903-1i7631y/spec.rb:50 # Array#subarray_count(subarray) counts the number of times the argument is present as a sub-array
rspec /tmp/d20111025-2903-1i7631y/spec.rb:54 # Array#subarray_count(subarray) works with arrays with non-numeric keys
rspec /tmp/d20111025-2903-1i7631y/spec.rb:58 # Array#subarray_count(subarray) work with empty arrays
rspec /tmp/d20111025-2903-1i7631y/spec.rb:62 # Array#subarray_count(subarray) work when the argument is larger than the array
rspec /tmp/d20111025-2903-1i7631y/spec.rb:68 # Array#occurences_count counts how many times an element is present in an array
rspec /tmp/d20111025-2903-1i7631y/spec.rb:73 # Array#occurences_count returns a hash that defaults to 0 when the key is not present
rspec /tmp/d20111025-2903-1i7631y/spec.rb:77 # Array#occurences_count works with arrays containing nil and false
rspec /tmp/d20111025-2903-1i7631y/spec.rb:81 # Array#occurences_count returns a hash, that does not change when indexed with a non-occuring element

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

Владимир обнови решението на 24.10.2011 16:58 (преди над 12 години)

+class Array
+ def to_hash
+ result = Hash.new
+ self.each do |element|
+ if element.kind_of?(Array) and element.length == 2
+ result.store(element[0], element[1])
+ else
+ puts "Array is not a list of pairs."
+ return
+ end
+ end
+ result
+ end
+end

Ако не си бил на лекцията в понеделник, когато се обсъждаха решенията на първа задача:

  • Hash.new, без аргументи, е по-добре да се запише с литерал: {}
  • Hash#store, wtf... За пръв път чувам за това :) Ползвай result[element[0]] = element[1] — от това по-идиоматичен израз няма! :) Идиоматичните неща са полезни за екипната работа
  • puts не ти трябва в тези задачи за домашното; не оставяй такива неща, зашото един ден може да решим да взимаме точки за нежелано писане по STDOUT :) Виждам, че в този случай си се опитал да направиш някакъв error handling и ти е простено, понеже за това още не сме говорили; следи темите на лекциите и гледай да не пропуснеш тази за изключения и error handling :)