From 3681b8eccda863b7f3c602af28811090996a9fcb Mon Sep 17 00:00:00 2001 From: me Date: Wed, 8 Apr 2026 20:59:40 +0300 Subject: [PATCH] first commit --- README.md | 331 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 331 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..04a7266 --- /dev/null +++ b/README.md @@ -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=/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.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.