3. Полиноми

Краен срок: 13:13, 29 ноември 2008

Крайният срок вече изтече. Не може да пращате решения.

Съседчето от третия етаж е в пети клас и иска да смята лесно полиноми, докато вие го зарибявате да пише на Ruby. За да успеете, очевидно трябва да му предложите приятен интерфейс към простите сметки с полоними.

За целта ще напишете клас Poly и изискванията за него са следните:

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

Друго