Първа задача
- Краен срок:
- 24.10.2011 17:00
- Точки:
- 6
Срокът за предаване на решения е отминал
В Ruby света, monkey patching се нарича добавянето на методи в съществуващи класове. Тази практика има както добри, така и лоши страни. Когато се прави умерено, позволява да надгражда Ruby по удобни начини. Използвайки я безотговорно, може да превърнете проект в ад за поддръжка или да направите библиотека неизползваема.
Като за първа задача, искаме от вас да monkey patch-нете Array
с четири метода:
Array#to_hash
В Ruby няма удобен начин да превърнете масив в хеш. Добавете метод в Array
, на име #to_hash
, който до обръща масив от двойки [ключ, стойност]
към хеш със съответните ключове и стойности:
[[:one, 1], [:two, 2]].to_hash # {one: 1, two: 2}
[[1, 2], [3, 4]].to_hash # {1 => 2, 3 => 4}
[[1, 2], [1, 3]].to_hash # {1 => 3}
[].to_hash # {}
Ако един ключ се съдържа в няколко двойки, вземете стойността от последната.
Приемете, че всички елементи са масиви с по два елемента, годни за хеширане.
Array#index_by
Добавете метод index_by
в Array
, приемащ блок и връщащ хеш, в който всяка стойност е елемент от масива, а ключа е оценката на блока за този елемент:
['John Coltrane', 'Miles Davis'].index_by { |name| name.split(' ').last }
# {'Coltrane' => 'John Coltrane', 'Davis' => 'Miles Davis' }
%w[foo larodi bar].index_by { |s| s.length }
# {3 => 'bar', 6 => 'larodi'}
Ако блока оценява няколко елемента на една и съща стойност, ползвайте последния.
Array#subarray_count
Добавете метод array.subarray_count(subarray)
, който да преброява колко пъти subarray
се среща като подсписък на array
:
[1, 2, 3, 2, 3, 1].subarray_count([2, 3]) # 2
[1, 2, 2, 2, 2, 1].subarray_count([2, 2]) # 3
[1, 1, 2, 2, 1, 1, 1].subarray_count([1, 1]) # 3
Array#occurences_count
Добавете метод occurences_count
в Array
, който връща хеш, съпоставящ елемент от масива на броя пъти, които се среща в него.
[:foo, :bar, :foo].occurences_count # {foo: 2, bar: 1}
%w[a a b c b a].occurences_count # {'a' => 3, 'b' => 2, 'c' => 1}
Когато елемент не се среща в масива, индексирането на хеша трябва да връща 0, без да изменя двойките му:
occurences = [:a, :a, :b].occurences_count
occurences[:a] # 2
occurences[:b] # 1
occurences[:c] # 0
p occurences # {a: 2, b: 1}
Подсказка: погледнете конструктора на Hash.
Примерен тест
За информация как да изпълните примерния тест, погледнете GitHub хранилището с домашните.