first commit
This commit is contained in:
331
README.md
Normal file
331
README.md
Normal file
@@ -0,0 +1,331 @@
|
|||||||
|
# Тесты к курсу «Парадигмы программирования»
|
||||||
|
|
||||||
|
[Условия домашних заданий](https://www.kgeorgiy.info/courses/paradigms/homeworks.html)
|
||||||
|
|
||||||
|
## Домашнее задание 7. Объектные выражения на JavaScript [](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 [](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 [](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. Вычисления в различных типах [](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. Очереди [](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. Очередь на массиве [](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. Бинарный поиск [](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. Обработка ошибок [](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.
|
||||||
Reference in New Issue
Block a user