Перейти к содержанию

Тестовое задание для программных проектов

Задача 1

Напишите мини-библиотеку для работы с многочленами от одной переменной. Она должна поддерживать следующие операции:

  • Построение многочлена по его выражению, записанному внутри языка (это не задача про парсеры). Например, по выражению

    \[ 1+3x^2-x+8 \]

    должен быть создан многочлен с коэффициентами \(9\),\(-1\),\(3\) при степенях \(x^0\),\(x^1\),\(x^2\) соответственно.

  • Алгебраические операции над многочленами:

    • константный многочлен
    • прибавление константы
    • сложение многочленов
    • нулевой многочлен
    • вычитание константы
    • вычитание многочленов
    • отрицание многочлена
    • умножение на константу
    • умножение на другой многочлен
    • единичный многочлен
    • возведение многочлена в натуральную степень
  • Подстановка одного многочлена в другой, вычисление многочлена в заданной точке, вычисление многочлена при подстановке квадратной матрицы (представление матриц, как и представление многочленов, на Ваше усмотрение).

  • Операция "уборки мусора", приводящая многочлен к максимально компактной форме.

Принимаются любые корректные решения, на любом языке программирования, главное чтобы я мог проверить решение на своём устройстве (Arch Linux).

Плюсом будет, если:

  • Решение пишется на том же языке, на котором будет решаться курсовая;
  • В решении выдержан определённый стиль оформления;
  • Решение также содержит автоматические тесты и документацию;
  • Код переиспользуется для получения более простой, краткой, читаемой и поддерживаемой реализации;
  • При создании многочлена по выражению не используется метапрограммирование;
  • Решение можно переиспользовать с различными типами коэффициентов (натуральные? целые? рациональные? матрицы?);
  • Решение можно переиспользовать с пользовательскими типами коэффициентов, не фиксированными заранее;
  • Недопустимость операций (например, отрицание многочлена с натуральными коэффициентами) сообщается пользователю как можно раньше (например, на этапе компиляции);
  • При конструировании многочлена с помощью лямбда-выражения, аргумент \(x\) не поддерживает иных операций, кроме присущих всем объектам выбранного языка и кроме необходимых для построения многочленов (т.е. его нельзя использовать не по назначению).

Задача 2*

Всё то же самое, но для многочленов с несколькими переменными. Вдобавок к вышеозвученным плюсикам в карму, плюсом будет, если:

  • Решение можно переиспользовать с различными типами переменных (символы? строки? натуральные числа? числа от \(1\) до \(n\)? тип из одного элемента?);
  • В многочлены с переменными одного типа \(X\) можно подставлять многочлены с переменными другого типа \(Y\) (в результате должны получаться многочлены с переменными типа \(Y\)).
  • При использовании правильного типа переменных, многочлены с несколькими переменными вырождаются в многочлены от одной переменной (т.е. для них можно выписать то же самое API, что для многочленов от одной переменной).
  • Алгебраические операции доступны при использовании произвольного типа переменных (хоть пусть переменные являются функциями). При этом, операция "уборки мусора" может предъявлять дополнительные требования к используемому типу переменных.