3. Полиноми
Краен срок:
13:13, 29 ноември 2008
Крайният срок вече изтече. Не може да пращате решения.
Съседчето от третия етаж е в пети клас и иска да смята лесно полиноми, докато вие го зарибявате да пише на Ruby. За да успеете, очевидно трябва да му предложите приятен интерфейс към простите сметки с полоними.
За целта ще напишете клас Poly
и изискванията за него са следните:
- Да може да се инициализира със списък от коефициенти, като индексът съответства на степента на променливата.
poly = Poly.new [1, 0, 2, 0] # 2x^2 + 1
- Да може да се инициализира с хеш, в който ключовете са степени, а стойностите — коефициенти.
poly = Poly.new({0 => 1, 2 => 2, 8 => 0}) # 2x^2 + 1
- Да поддържа сравнение за равенство с
==
- Събиране на полином с полином и полином с цяло число. Трябва да се реализира с оператора
+
и резултатът трябва да бъде нов полином. - Изваждане на полином от полином и на цяло число от полином. Операторът този път е
-
, а резултатът отново е полином. - Умножение на полиноми и полином с цяло число. Важат същите правила като за събирането и изваждането.
- Повдигане на степен цяло, неотрицателно число. Операторът е
**
, резултатът — полином. - Оператор
[]
, по степен трябва да се дава коефициент или 0, ако няма такъв. - Да се поддържа промяна на коефициенти с оператора
[]
:
poly = Poly.new [1, 0, 2] poly[1] = 5 puts poly[1] # 5
- Намиране на производна с оператора
~
. Резултатът трябва да бъде отново полином.
~Poly.new [1, 0, 2] # 4x
- Класът ви трябва да има методи, като вградените: find, include?, sort_by и map. Където в тях се ползва блок, трябва да му се дават два аргумента — степен и коефициент, а където се приема обект, трябва да се очаква масив от два елемента, отново степен и коефициент.
sort_by
връща списъk от двойки.map
въща списък от резулатите от блока, аfind
връща двойка илиnil
.include?
трябва да смята, че едночлените с нулеви коефициенти са вътре, ноmap
,sort_by
иfind
не трябва да ги включват. - Класът ви трябва да има метод
to_s
, който връща низ с полинома в човешки вид, като спазва следните прости правила:- Няма празни места в резултата
- Първи са по-старшите едночлени
- Ако старшият коефициент е положителен пред него не се поставя знака
+
- Ако коефициентът на някой едночлен е 0, то той се пропуска
- Ако коефициентът на някой едночлен по модул е 1, то коефициентът не се изписва
- Ако степента на някой едночлен е 1, то тя не се изписва
- Знакът за степен е
^
- Променливата е
x
- Пример:
5x^3+2x+1