Първа задача

Предадени решения

Краен срок:
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 хранилището с домашните.