Files
paradigms/README.md
me 1b736a9a17
All checks were successful
Array Queue Test / test (push) Successful in 23s
Exception Test / test (push) Successful in 1m22s
Generic Test / test (push) Successful in 39s
JavaScript Example Test / test (push) Successful in 8s
JavaScript Expressions Test / test (push) Successful in 36s
JavaScript Objective Expressions Test / test (push) Successful in 25s
Queues Test / test (push) Successful in 20s
Binary Search Test / test (push) Successful in 12s
README update
2026-04-09 13:52:08 +03:00

330 lines
25 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Тесты к курсу «Парадигмы программирования»
[Условия домашних заданий](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=<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.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.