first commit

This commit is contained in:
me
2026-04-08 20:59:40 +03:00
commit 3681b8eccd

331
README.md Normal file
View File

@@ -0,0 +1,331 @@
# Тесты к курсу «Парадигмы программирования»
[Условия домашних заданий](https://www.kgeorgiy.info/courses/paradigms/homeworks.html)
## Домашнее задание 7. Объектные выражения на JavaScript [![JavaScript Objective Expressions Tests](https://git.codejava.tech/me/paradigms/actions/workflows/js-objective-expressions.yml/badge.svg)](https://git.codejava.tech/me/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.codejava.tech/me/paradigms/actions/workflows/js-expressions.yml/badge.svg)](https://git.codejava.tech/me/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.codejava.tech/me/paradigms/actions/workflows/js-example.yml/badge.svg)](https://git.codejava.tech/me/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=<js>/graal --class-path <js> jstest.example.ExampleTest {hard|easy} <variant>`, где
* `-ea` включение проверок времени исполнения;
* `--module-path=<js>/graal` путь к модулям Graal (здесь и далее `<js>` путь к каталогу `javascript` этого репозитория);
* `--class-path <js>` путь к откомпилированным тестам;
* `{hard|easy}` указание тестируемой сложности;
* `<variant>` указание тестируемой модификации.
* При запуске из 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.codejava.tech/me/paradigms/actions/workflows/generic.yml/badge.svg)](https://git.codejava.tech/me/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/me/paradigms/actions/workflows/queues.yml/badge.svg)](https://git.codejava.tech/me/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/me/paradigms/actions/workflows/array-queue.yml/badge.svg)](https://git.codejava.tech/me/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/me/paradigms/actions/workflows/search.yml/badge.svg)](https://git.codejava.tech/me/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/me/paradigms/actions/workflows/exception.yml/badge.svg)](https://git.codejava.tech/me/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.