Първа задача
- Краен срок:
- 15.10.2012 17:00
- Точки:
- 6
Срокът за предаване на решения е отминал
Monkey patching се нарича промяната на вградени класове (като например String
), често с цел добавяне на полезна функционалност. В едни случаи това е страхотна идея и резултира в много по-добър код. В други е ужасна идея и не трябва да се прави. Във всички случаи е супер забавно.
Искаме отрано да изкараме от системата ви нуждата за monkey patching. Затова тази задача иска от вас да направите цели четири monkey patch-а.
Integer#prime_divisors
Добавете метод в Integer
, който ви връща списък от простите числа, на които числото се дели. Например:
4.prime_divisors # [2]
10.prime_divisors # [2, 5]
36.prime_divisors # [2, 3]
42.prime_divisors # [2, 3, 7]
17.prime_divisors # [17]
Имайте предвид следното:
- Не става въпрос разлагане на прости делители -
4.prime_divisors
връща[2]
, а не[2, 2]
- Числата трябва да са подредени във възходящ ред
- Смятайте, че в 0 и 1 метода е недефиниран
- Метода трябва да работи с отрицателни числа, като:
x.prime_divisors == (-x).prime_divisors
.
Range#fizzbuzz
Добавете метод на Range
, който да връща списък с числата от Range
-а, в който:
- Числата, които се делят на 3 са заменени със символа
:fizz
- Числата, които се делят на 5 са заменени със символа
:buzz
- Числата, които се делят на 3 и на 5 са заменени със символа
:fizzbuzz
Например:
(1..6).fizzbuzz # [1, 2, :fizz, 4, :buzz, :fizz]
Вземете предвид разликата между a..b
и a...b
.
Hash#group_values
Добавете метод в Hash
, който съпоставя всяка стойност в хеша на масив от ключове, които сочат към нея. Например:
{a: 1}.group_values # {1 => [:a]}
{a: 1, b: 2, c: 1}.group_values # {1 => [:a, :c], 2 => [:b]}
Редът на елементите в масива трябва да бъде реда на добавяне в хеша. Не променяйте хеша.
Хвърлете един поглед на Hash#new
за идеи за добра имплементация.
Array#densities
Добавете метод в Array
, връщаш нов масив с, съпоставяш всеки елемент на броя пъти, в които той се среща в първия масив. Именно:
[:a, :b, :c] # [1, 1, 1]
[:a, :b, :a] # [2, 1, 2]
[:a, :a, :a] # [3, 3, 3]
Не променяйте масива.
Бележки
Материалът, който сме ви показали на лекции може да не е напълно достатъчен да решите тази задача. При всички случаи, той е недостатъчен за да решите задачата качествено. За да се справите добре, ще се наложи да се поразтърсите. Google е ваш приятел. Също така, APIDock може да ви бъде много полезен.
Като за първа задача, почти няма да вземаме много точки за лош стил. Изключения правят неконсистентна индентация, много глупави имена на променливи (това включва шльокавица) или пълно объркване на прости неща (като локални и глобални променливи). Когато крайния срок на задачата изтече, ще оставим подробни коментари за грешки в стила. Хвърлете един поглед на style guide-а преди да пишете код.
Не използвайте никакви модули. require
е забранена думичка.