--- gitea: none include_toc: true --- # Тесты к курсу «Парадигмы программирования» [Условия домашних заданий](https://www.kgeorgiy.info/courses/paradigms/homeworks.html) ## Домашнее задание 9. Линейная алгебра на Clojure [![Clojure Linear Tests](https://git.codejava.tech/codejava/paradigms/actions/workflows/clj-linear.yml/badge.svg)](https://git.codejava.tech/codejava/paradigms/actions) Модификации * *Базовая* ✅ * Код должен находиться в файле `clojure-solutions/linear.clj`. * [Исходный код тестов](clojure/cljtest/linear/LinearTest.java) * Запускать с указанием сложности (`easy` или `hard`) и модификации. ## Домашнее задание 8. Обработка ошибок на JavaScript [![JavaScript Prefix Tests](https://git.codejava.tech/codejava/paradigms/actions/workflows/js-prefix.yml/badge.svg)](https://git.fym.su/code.java/paradigms/actions) Модификации * *Base* ✅ * Код должен находиться в файле `javascript-solutions/objectExpression.js`. * [Исходный код тестов](javascript/jstest/prefix/ParserTest.java) * Запускать с указанием модификации и сложности (`easy` или `hard`). * *Postfix*. ✅ Дополнительно реализовать поддержку: * Выражений в постфиксной записи: * `(2 3 +)` равно 5 * функция `parsePostfix` * метод `postfix` * [Исходный код тестов](javascript/jstest/prefix/PostfixTest.java) * Запускать с указанием модификации и сложности (`easy` или `hard`). * *3637*. ✅ Дополнительно реализовать поддержку: * постфиксной записи; * разных видов скобок: квадратных (`[]`), фигурных (`{}`), угловых (`<>`); * операций произвольного числа аргументов: * `SumExp` (`sumExp`) – сумма экспонент, `(sumExp 2 3 16)` примерно равно 8886137; * `Lse` (`lse`) – [LogSumExp](https://en.wikipedia.org/wiki/LogSumExp), `(lse 2 3 16)` примерно равно 16. * *3839*. ✅ Дополнительно реализовать поддержку: * постфиксной записи; * разных видов скобок: квадратных (`[]`), фигурных (`{}`), угловых (`<>`). * операций произвольного числа аргументов: * `SumExp` (`sumExp`) – сумма экспонент, `(sumExp 2 3 16)` примерно равно 8886137; * `Lme` (`lme`) – логарифма среднего экспонент, `(lme 2 7 9)` примерно равно 8. * *3435*. ✅ Дополнительно реализовать поддержку: * разных видов скобок: квадратных (`[]`), фигурных (`{}`), угловых (`<>`), французские кавычки (`«»`). * операций произвольного числа аргументов: * `MeanExp` (`meanExp`) – среднее экспонент, `(meanExp 2 4 15)` примерно равно 1089693. * *3233*. ✅ Дополнительно реализовать поддержку: * разных видов скобок: квадратных (`[]`), фигурных (`{}`), угловых (`<>`), французские кавычки (`«»`). * операций одного или двух аргументов: * `ArcTan12` (`atan12`) – арктангенс, `(atan12 1256)` примерно равно 1.57, `(atan12 841 540)` примерно равно 1. ## Домашнее задание 7. Объектные выражения на JavaScript [![JavaScript Objective Expressions Tests](https://git.codejava.tech/codejava/paradigms/actions/workflows/js-objective-expressions.yml/badge.svg)](https://git.codejava.tech/codejava/paradigms/actions) Модификации * *Base* ✅ * Код должен находиться в файле `javascript-solutions/objectExpression.js`. * [Исходный код тестов](javascript/jstest/object/ObjectTest.java) * Запускать с указанием модификации и сложности (`easy`, `hard` или `bonus`). * *Simplify*. ✅ С проверкой упрощений. * *3637*. ✅ Дополнительно реализовать поддержку: * бинарных функций: * `Power` (`pow`) – возведение в степень, `2 3 pow` равно 8; * `Log` (`log`) – логарифм абсолютного значения аргумента по абсолютному значению основания `-2 -8 log` равно 3. * функций от `N` аргументов для `N=1..5`: * `SumN` (`sumN`) – сумма аргументов, `1 2 3 4 5 sum5` равно 15. * *3839*. ✅ Дополнительно реализовать поддержку: * функций: * `Gauss` (`gauss`) – [функция Гаусса](https://ru.wikipedia.org/wiki/%D0%93%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D0%B0_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F); от четырех аргументов: `a`, `b`, `c`, `x`. * функций от `N` аргументов для `N=1..5`: * `SumN` (`sumN`) – сумма аргументов, `1 2 3 4 5 sum5` равно 15. * `AvgN` (`avgN`) – арифметическое среднее аргументов, `1 2 3 4 5 avg5` равно 3. * *3435*. ✅ Дополнительно реализовать поддержку функций: * `Wrap` (`wrap`) – функции [wrap(_x_, _min_, _max_)](https://en.wikipedia.org/wiki/Wrapping_(graphics)), `3 5 8 wrap` равно 6; * `SoftWrap` (`softWrap`) – сглаженного аналога `wrap`:\ softWrap(_x_, _min_, _max_, _λ_) = arcsin(cos(_a_) * tanh(_λ_ * -sin(_a_))) * (_max_ - _min_) / π + (_max_ + _min_) / 2,\ где _a_ = π * (_x_ - _min_) / (_max_ - _min_) `3 5 8 0.5 softWrap` примерно равно 6.3. * *3233*. ✅ Дополнительно реализовать поддержку функций: * `Wrap` (`wrap`) – функции [wrap(_x_, _min_, _max_)](https://en.wikipedia.org/wiki/Wrapping_(graphics)), `3 5 8 wrap` равно 6. ## Домашнее задание 6. Функциональные выражения на JavaScript [![JavaScript Expressions Tests](https://git.codejava.tech/codejava/paradigms/actions/workflows/js-expressions.yml/badge.svg)](https://git.codejava.tech/codejava/paradigms/actions) Модификации * *Базовая* ✅ * Код должен находиться в файле `javascript-solutions/functionalExpression.js`. * [Исходный код тестов](javascript/jstest/functional/FunctionalTest.java) * Запускать с аргументом `hard` или `easy`. * *3637*. ✅ Дополнительно реализовать поддержку: * переменных: `y`, `z`; * констант: `one` – 1, `two` – 2, `three` – 3; * операций: * `clamp` – функции [clamp(_x_, _min_, _max_)](https://en.wikipedia.org/wiki/Clamp_(function)), `3 5 8 clamp` равно 5; * `wrap` – функции [wrap(_x_, _min_, _max_)](https://en.wikipedia.org/wiki/Wrapping_(graphics)), `3 5 8 wrap` равно 6. * `argMin3` – индекс минимального из трёх аргументов, `3 4 1 argMin3` равно 2; * `argMax3` – индекс максимального из трёх аргументов, `3 4 1 argMax3` равно 1; * `argMin5` – индекс минимального из пяти аргументов, `3 4 1 5 6 argMin5` равно 2; * `argMax5` – индекс максимального из пяти аргументов, `3 4 10 5 6 argMax5` равно 2. * *3839*. ✅ Дополнительно реализовать поддержку: * переменных: `y`, `z`; * констант: `one` – 1, `two` – 2, `three` – 3; * операций: * `clamp` – функции [clamp(_x_, _min_, _max_)](https://en.wikipedia.org/wiki/Clamp_(function)), `3 5 8 clamp` равно 5; * `softClamp` – сглаженного аналога `clamp`:\ softClamp(_x_, _min_, _max_, _λ_) = _min_ + (_max_ - _min_) / (1 + exp(_λ_((_max_ + _min_) / 2 - _x_))),\ `3 5 8 0.2 softClamp` примерно равно 6. * `argMin3` – индекс минимального из трёх аргументов, `3 4 1 argMin3` равно 2; * `argMax3` – индекс максимального из трёх аргументов, `3 4 1 argMax3` равно 1; * `argMin5` – индекс минимального из пяти аргументов, `3 4 1 5 6 argMin5` равно 2; * `argMax5` – индекс максимального из пяти аргументов, `3 4 10 5 6 argMax5` равно 2. * *3435*. ✅ Дополнительно реализовать поддержку: * переменных: `y`, `z`; * констант: `one` – 1, `two` – 2, `three` – 3; * операций: * `arcTan` (`atan`) – унарный арктангенс, `1256 atan` примерно равно 1.57; * `arcTan2` (`atan2`) – бинарный арктангенс, `841 540 atan2` примерно равно 1. * *3233*. ✅ Дополнительно реализовать поддержку: * переменных: `y`, `z`; * констант: `one` – 1, `two` – 2, `three` – 3; * операций: * `sin` – синус, `3.14159265 sin` примерно равно 0; * `cos` – косинус, `3.14159265 cos` примерно равно -1. ## Домашнее задание 5. Вычисления в различных типах [![Generic Tests](https://git.codejava.tech/codejava/paradigms/actions/workflows/generic.yml/badge.svg)](https://git.codejava.tech/codejava/paradigms/actions) Модификации * *Base* ✅ * Класс `GenericTabulator` должен реализовывать интерфейс [Tabulator](java/expression/generic/Tabulator.java) и строить трёхмерную таблицу значений заданного выражения. * `mode` – режим вычислений: * `i` – вычисления в `int` с проверкой на переполнение; * `d` – вычисления в `double` без проверки на переполнение; * `bi` – вычисления в `BigInteger`. * `expression` – выражение, для которого надо построить таблицу; * `x1`, `x2` – минимальное и максимальное значения переменной `x` (включительно) * `y1`, `y2`, `z1`, `z2` – аналогично для `y` и `z`. * Результат: элемент `result[i][j][k]` должен содержать значение выражения для `x = x1 + i`, `y = y1 + j`, `z = z1 + k`. Если значение не определено (например, по причине переполнения), то соответствующий элемент должен быть равен `null`. * [Исходный код тестов](java/expression/generic/GenericTest.java) * Первый аргумент: `easy` или `hard` * Последующие аргументы: модификации * *3637* ✅ Дополнительно реализуйте: * Унарные операции: * `count` – число установленных битов, `count 5` равно 2. * Бираные операции (минимальный приоритет): * `min` – минимум, `2 min 3` равно 2; * `max` – максимум, `2 max 3` равно 3. * Поддержку режимов: * `u` – вычисления в `int` без проверки на переполнение; * `s` – вычисления в `short` без проверки на переполнение; * `f` – вычисления в `float` без проверки на переполнение. * *3839* ✅ Дополнительно реализуйте: * Унарные операции: * `count` – число установленных битов, `count 5` равно 2. * Бинарные операции (минимальный приоритет): * `min` – минимум, `2 min 3` равно 2; * `max` – максимум, `2 max 3` равно 3. * Поддержку режимов: * `u` – вычисления в `int` без проверки на переполнение; * `s` – вычисления в `short` без проверки на переполнение; * `t` – вычисления в `int` без проверки на переполнение с отбрасыванием остатка от деления на 10. * *3435* ✅ Дополнительно реализуйте: * Унарные операции: * `count` – число установленных битов, `count 5` равно 2. * Бинарные операции (минимальный приоритет): * `min` – минимум, `2 min 3` равно 2; * `max` – максимум, `2 max 3` равно 3. * Поддержку режимов: * `u` – вычисления в `int` без проверки на переполнение; * *3233* ✅ Дополнительно реализуйте поддержку режимов: * `u` – вычисления в `int` без проверки на переполнение; * `s` – вычисления в `short` без проверки на переполнение; * `f` – вычисления в `float` без проверки на переполнение. ## Домашнее задание 4. Очереди [![Queues Tests](https://git.codejava.tech/codejava/paradigms/actions/workflows/queues.yml/badge.svg)](https://git.codejava.tech/codejava/paradigms/actions) Модификации * *Базовая* ✅ * [Исходный код тестов](java/queue/QueueTest.java) * [Откомпилированные тесты](artifacts/queue/QueueTest.jar) * Для работы тестов необходимо добавить опцию JVM `--add-opens java.base/java.util=ALL-UNNAMED` * *3637* ✅ * Добавить в интерфейс очереди и реализовать методы * `contains(element)` – проверяет, содержится ли элемент в очереди * `removeFirst(element)` – удаляет первое вхождение элемента в очередь и возвращает было ли такое * Дублирования кода быть не должно * *3839* ✅ * Добавить в интерфейс очереди и реализовать методы * `getNth(n)` – создать очередь, содержащую каждый n-й элемент, считая с 1 * `removeNth(n)` – создать очередь, содержащую каждый n-й элемент, и удалить их из исходной очереди * `dropNth(n)` – удалить каждый n-й элемент из исходной очереди * Тип возвращаемой очереди должен соответствовать типу исходной очереди * Дублирования кода быть не должно * *3435* ✅ * Добавить в интерфейс очереди и реализовать методы * `removeIf(predicate)` – удалить элементы, удовлетворяющие [предикату](https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/function/Predicate.html) * `retainIf(predicate)` – удалить элементы, не удовлетворяющие [предикату](https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/function/Predicate.html) * Взаимный порядок элементов должен сохраняться * Дублирования кода быть не должно * *3233* ✅ * Добавить в интерфейс очереди и реализовать методы * `removeAll(element)` – удалить все элементы равные заданному * `retainAll(predicate)` – оставить только элементы равные заданному * Взаимный порядок элементов должен сохраняться * Дублирования кода быть не должно ## Домашнее задание 3. Очередь на массиве [![ArrayQueue Tests](https://git.codejava.tech/codejava/paradigms/actions/workflows/array-queue.yml/badge.svg)](https://git.codejava.tech/codejava/paradigms/actions) Модификации * *Базовая* ✅ * Классы должны находиться в пакете `queue` * [Исходный код тестов](java/queue/ArrayQueueTest.java) * [Откомпилированные тесты](artifacts/queue/ArrayQueueTest.jar) * Для работы тестов необходимо добавить опцию JVM `--add-opens java.base/java.util=ALL-UNNAMED` * *3637*. Дополнительно реализовать методы: ✅ * `push` – добавить элемент в начало очереди; * `peek` – вернуть последний элемент в очереди; * `remove` – вернуть и удалить последний элемент из очереди; * `count` – вернуть число вхождений элемента в очередь. * *3839*. Дополнительно реализовать методы: ✅ * `push` – добавить элемент в начало очереди; * `peek` – вернуть последний элемент в очереди; * `remove` – вернуть и удалить последний элемент из очереди; * `countIf` – вернуть число элементов очереди, удовлетворяющих [предикату](https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/function/Predicate.html). * *3435* ✅ * Дополнительно реализовать методы: * `indexIf` – вернуть индекс первого элемента, удовлетворяющего [предикату](https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/function/Predicate.html); * `lastIndexIf` – вернуть индекс последнего элемента, удовлетворяющего [предикату](https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/function/Predicate.html). * Индексы отсчитываются с головы очереди. * Если искомого элемента нет, методы должны возвращать `-1`. * *3233* ✅ * Дополнительно реализовать методы: * `indexOf` – вернуть индекс первого вхождения элемента в очередь; * `lastIndexOf` – вернуть индекс последнего вхождения элемента в очередь. * Индексы отсчитываются с головы очереди. * Если искомого элемента нет, методы должны возвращать `-1`. ## Домашнее задание 2. Бинарный поиск [![BinarySearch Tests](https://git.codejava.tech/codejava/paradigms/actions/workflows/search.yml/badge.svg)](https://git.codejava.tech/codejava/paradigms/actions) Модификации * *Базовая* ✅ * Класс `BinarySearch` должен находиться в пакете `search` * [Исходный код тестов](java/search/BinarySearchTest.java) * [Откомпилированные тесты](artifacts/search/BinarySearchTest.jar) * *3637* ✅ * На вход подаётся число `x` и массив, отсортированный по невозрастанию. * Требуется вывести число элементов массива, равных `x`. * Не допускается использование типов `long` и `BigInteger`. * Класс должен иметь имя `BinarySearch3637` * *3839* ✅ * На вход подаётся число `x` и массив, отсортированный по невозрастанию. * Требуется вывести два числа: начало и длину диапазона элементов, равных `x`. Если таких элементов нет, то следует вывести пустой диапазон, у которого левая граница совпадает с местом вставки элемента `x`. * Не допускается использование типов `long` и `BigInteger`. * Класс должен иметь имя `BinarySearch3839` * *3435* ✅ * На вход подается отсортированный (строго) по убыванию массив, циклически сдвинутый на `k` элементов. Все числа в массиве различны. * Требуется найти `k`. * Класс должен иметь имя `BinarySearch3435` * *3233* ✅ * На вход подается отсортированный (строго) по возрастанию массив, циклически сдвинутый на `k` элементов. Все числа в массиве различны. * Требуется найти `k`. * Класс должен иметь имя `BinarySearch3233` ## Домашнее задание 1. Обработка ошибок [![Exception Tests](https://git.codejava.tech/codejava/paradigms/actions/workflows/exception.yml/badge.svg)](https://git.codejava.tech/codejava/paradigms/actions) Модификации * *Base* ✅ * Класс `ExpressionParser` должен реализовывать интерфейс [ListParser](java/expression/exceptions/ListParser.java). * Результат разбора должен реализовывать интерфейс [ListExpression](java/expression/ListExpression.java). * Нельзя использовать типы `long` и `double` * Нельзя использовать методы классов `Math` и `StrictMath` * [Исходный код тестов](java/expression/exceptions/ExceptionsTest.java) * Первый аргумент: `easy` или `hard` * Последующие аргументы: модификации * *3637* ✅ * Дополнительно реализуйте унарные операции * `‖x‖` – модуль, `‖-5‖` равно 5; * `³` – возведение в куб, `-5³` равно −125; * `∛` – кубический корень, `∛-123` равно -4. * *3839* ✅ * Дополнительно реализуйте унарные операции: * `‖x‖` – модуль, `‖-5‖` равно 5; * `²` – возведение в квадрат, `-5²` равно 25; * `√` – квадратный корень, `√24` равно 4; * `³` – возведение в куб, `-5³` равно −125; * `∛` – кубический корень, `∛-123` равно -4. * *3435* ✅ * Дополнительно реализуйте унарные операции: * `‖x‖` – модуль, `‖-5‖` равно 5; * `√` – квадратный корень, `√24` равно 4. * *3233* ✅ * Дополнительно реализуйте унарные операции: * `‖x‖` – модуль числа, `‖-5‖` равно 5; * `∛` – кубический корень, `∛-123` равно -4.