# Тесты к курсу «Парадигмы программирования» [Условия домашних заданий](https://www.kgeorgiy.info/courses/paradigms/homeworks.html) ## Домашнее задание 7. Объектные выражения на JavaScript [![JavaScript Objective Expressions Tests](https://git.fym.su/code.java/paradigms/actions/workflows/js-objective-expressions.yml/badge.svg)](https://git.fym.su/code.java/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. ## Домашнее задание 6. Функциональные выражения на JavaScript [![JavaScript Expressions Tests](https://git.fym.su/code.java/paradigms/actions/workflows/js-expressions.yml/badge.svg)](https://git.fym.su/code.java/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. ## Исходный код к лекциям по JavaScript [Скрипт с примерами](javascript/examples.js) Запуск примеров * [В браузере](javascript/RunJS.html) * Из консоли * [на Java](javascript/RunJS.java): [RunJS.cmd](javascript/RunJS.cmd), [RunJS.sh](javascript/RunJS.sh) * [на node.js](javascript/RunJS.node.js): `node RunJS.node.js` Лекция 1. Типы и функции * [Типы](javascript/examples/1_1_types.js) * [Массивы](javascript/examples/1_2_arrays.js). Обратите внимание, у массивов есть много [других методов](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array). * [Функции](javascript/examples/1_3_functions.js) * [Функции высшего порядка](javascript/examples/1_4_functions-hi.js). Обратите внимание на реализацию функции `mCurry`. Обратите внимание, что функции `array.map` и `array.reduce` (аналог `leftFold`) входят в стандартную библиотеку. * [Пример: вектора и матрицы](javascript/examples/1_5_vectors.js). ## Тестовое задание на JavaScript [![JavaScript Example Tests](https://git.fym.su/code.java/paradigms/actions/workflows/js-example.yml/badge.svg)](https://git.fym.su/code.java/paradigms/actions) Это задание предназначено для проверки правильности настройки [JavaScript](https://ecma-international.org/publications-and-standards/standards/ecma-262/). Вам надо проверить, что оно успешно проверяется на вашем компьютере. Модификации * *base* ✅ * Код решения `javascript-solutions/example.js` в [репозитории решений](https://www.kgeorgiy.info/git/geo/paradigms-2026-students/). Если всё настроено верно, то вам достаточно сделать `git pull --rebase` в своём репозитории, чтобы получить решение. * [Исходный код тестов](javascript/jstest/example/ExampleTest.java) * Запускать с аргументом `hard` или `easy`. Запуск тестов * Для запуска тестов используется [GraalJS](https://github.com/graalvm/graaljs) (часть проекта [GraalVM](https://www.graalvm.org/)), но вам не требуется их скачивать. * Для запуска тестов рекомендуется использовать скрипты [TestJS.cmd](javascript/TestJS.cmd) и [TestJS.sh](javascript/TestJS.sh) * Репозиторий должен быть скачан целиком. * Скрипты должны находиться в каталоге `javascript` (их нельзя перемещать, но можно вызывать из других каталогов). * В качестве аргументов командной строки указывается полное имя класса теста и модификация, например `jstest.example.ExampleTest hard base`. * Для самостоятельного запуска из консоли необходимо использовать командную строку вида: `java -ea --module-path=/graal --class-path jstest.example.ExampleTest {hard|easy} `, где * `-ea` – включение проверок времени исполнения; * `--module-path=/graal` путь к модулям Graal (здесь и далее `` путь к каталогу `javascript` этого репозитория); * `--class-path ` путь к откомпилированным тестам; * `{hard|easy}` указание тестируемой сложности; * `` указание тестируемой модификации. * При запуске из IDE, обычно не требуется указывать `--class-path`, так как он формируется автоматически. Остальные опции всё равно необходимо указать. * Troubleshooting * `Error occurred during initialization of boot layer java.lang.module.FindException: Module org.graalvm.truffle not found, required by jdk.internal.vm.compiler` – неверно указан `--module-path`; * `Graal.js not found` – неверно указаны `--module-path` * `Error: Could not find or load main class jstest.example.ExampleTest` – неверно указан `--class-path`; * `Exception in thread "main" java.lang.AssertionError: You should enable assertions by running 'java -ea jstest.functional.FunctionalExpressionTest'` – не указана опция `-ea`; * `Exception in thread "main" jstest.EngineException: Script 'example.js' not found` – в текущем каталоге отсутствует решение (`example.js`) ## Домашнее задание 5. Вычисления в различных типах [![Generic Tests](https://git.fym.su/code.java/paradigms/actions/workflows/generic.yml/badge.svg)](https://git.fym.su/code.java/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.fym.su/code.java/paradigms/actions/workflows/queues.yml/badge.svg)](https://git.fym.su/code.java/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.fym.su/code.java/paradigms/actions/workflows/array-queue.yml/badge.svg)](https://git.fym.su/code.java/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.fym.su/code.java/paradigms/actions/workflows/search.yml/badge.svg)](https://git.fym.su/code.java/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.fym.su/code.java/paradigms/actions/workflows/exception.yml/badge.svg)](https://git.fym.su/code.java/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.