Files
paradigms/README.md
root 975a15b9e7
All checks were successful
Array Queue Test / test (push) Successful in 25s
Clojure Linear Test / test (push) Successful in 14s
Exception Test / test (push) Successful in 1m24s
Generic Test / test (push) Successful in 46s
JavaScript Expressions Test / test (push) Successful in 38s
JavaScript Objective Expressions Test / test (push) Successful in 2m50s
JavaScript Prefix Test / test (push) Successful in 2m50s
Queues Test / test (push) Successful in 21s
Binary Search Test / test (push) Successful in 14s
update README.md
2026-04-13 21:20:47 +03:00

336 lines
25 KiB
Markdown
Raw 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.
---
gitea: none
include_toc: true
---
# Тесты к курсу «Парадигмы программирования»
[Условия домашних заданий](https://www.kgeorgiy.info/courses/paradigms/homeworks.html)
## Домашнее задание 9. Линейная алгебра на Clojure [![Clojure Linear Tests](https://git.codejava.tech/codejava/paradigms/actions/workflows/clj-linear.yml/badge.svg)](https://git.codejava.tech/codejava/paradigms/actions)
Модификации
* *Базовая* ✅
* Код должен находиться в файле `clojure-solutions/linear.clj`.
* [Исходный код тестов](clojure/cljtest/linear/LinearTest.java)
* Запускать с указанием сложности (`easy` или `hard`) и модификации.
## Домашнее задание 8. Обработка ошибок на JavaScript [![JavaScript Prefix Tests](https://git.codejava.tech/codejava/paradigms/actions/workflows/js-prefix.yml/badge.svg)](https://git.fym.su/code.java/paradigms/actions)
Модификации
* *Base* ✅
* Код должен находиться в файле `javascript-solutions/objectExpression.js`.
* [Исходный код тестов](javascript/jstest/prefix/ParserTest.java)
* Запускать с указанием модификации и сложности (`easy` или `hard`).
* *Postfix*. ✅ Дополнительно реализовать поддержку:
* Выражений в постфиксной записи:
* `(2 3 +)` равно 5
* функция `parsePostfix`
* метод `postfix`
* [Исходный код тестов](javascript/jstest/prefix/PostfixTest.java)
* Запускать с указанием модификации и сложности (`easy` или `hard`).
* *3637*. ✅ Дополнительно реализовать поддержку:
* постфиксной записи;
* разных видов скобок: квадратных (`[]`), фигурных (`{}`), угловых (`<>`);
* операций произвольного числа аргументов:
* `SumExp` (`sumExp`) сумма экспонент,
`(sumExp 2 3 16)` примерно равно 8886137;
* `Lse` (`lse`) [LogSumExp](https://en.wikipedia.org/wiki/LogSumExp),
`(lse 2 3 16)` примерно равно 16.
* *3839*. ✅ Дополнительно реализовать поддержку:
* постфиксной записи;
* разных видов скобок: квадратных (`[]`), фигурных (`{}`), угловых (`<>`).
* операций произвольного числа аргументов:
* `SumExp` (`sumExp`) сумма экспонент,
`(sumExp 2 3 16)` примерно равно 8886137;
* `Lme` (`lme`) логарифма среднего экспонент,
`(lme 2 7 9)` примерно равно 8.
* *3435*. ✅ Дополнительно реализовать поддержку:
* разных видов скобок: квадратных (`[]`), фигурных (`{}`), угловых (`<>`), французские кавычки (`«»`).
* операций произвольного числа аргументов:
* `MeanExp` (`meanExp`) среднее экспонент,
`(meanExp 2 4 15)` примерно равно 1089693.
* *3233*. ✅ Дополнительно реализовать поддержку:
* разных видов скобок: квадратных (`[]`), фигурных (`{}`), угловых (`<>`), французские кавычки (`«»`).
* операций одного или двух аргументов:
* `ArcTan12` (`atan12`) арктангенс,
`(atan12 1256)` примерно равно 1.57,
`(atan12 841 540)` примерно равно 1.
## Домашнее задание 7. Объектные выражения на JavaScript [![JavaScript Objective Expressions Tests](https://git.codejava.tech/codejava/paradigms/actions/workflows/js-objective-expressions.yml/badge.svg)](https://git.codejava.tech/codejava/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.
* *3839*. ✅ Дополнительно реализовать поддержку:
* функций:
* `Gauss` (`gauss`) [функция Гаусса](https://ru.wikipedia.org/wiki/%D0%93%D0%B0%D1%83%D1%81%D1%81%D0%BE%D0%B2%D0%B0_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F);
от четырех аргументов: `a`, `b`, `c`, `x`.
* функций от `N` аргументов для `N=1..5`:
* `SumN` (`sumN`) сумма аргументов,
`1 2 3 4 5 sum5` равно 15.
* `AvgN` (`avgN`) арифметическое среднее аргументов,
`1 2 3 4 5 avg5` равно 3.
* *3435*. ✅ Дополнительно реализовать поддержку функций:
* `Wrap` (`wrap`) функции [wrap(_x_, _min_, _max_)](https://en.wikipedia.org/wiki/Wrapping_(graphics)),
`3 5 8 wrap` равно 6;
* `SoftWrap` (`softWrap`) сглаженного аналога `wrap`:\
softWrap(_x_, _min_, _max_, _λ_) = arcsin(cos(_a_) * tanh(_λ_ * -sin(_a_))) * (_max_ - _min_) / π + (_max_ + _min_) / 2,\
где _a_ = π * (_x_ - _min_) / (_max_ - _min_)
`3 5 8 0.5 softWrap` примерно равно 6.3.
* *3233*. ✅ Дополнительно реализовать поддержку функций:
* `Wrap` (`wrap`) функции [wrap(_x_, _min_, _max_)](https://en.wikipedia.org/wiki/Wrapping_(graphics)),
`3 5 8 wrap` равно 6.
## Домашнее задание 6. Функциональные выражения на JavaScript [![JavaScript Expressions Tests](https://git.codejava.tech/codejava/paradigms/actions/workflows/js-expressions.yml/badge.svg)](https://git.codejava.tech/codejava/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.
## Домашнее задание 5. Вычисления в различных типах [![Generic Tests](https://git.codejava.tech/codejava/paradigms/actions/workflows/generic.yml/badge.svg)](https://git.codejava.tech/codejava/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/codejava/paradigms/actions/workflows/queues.yml/badge.svg)](https://git.codejava.tech/codejava/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/codejava/paradigms/actions/workflows/array-queue.yml/badge.svg)](https://git.codejava.tech/codejava/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/codejava/paradigms/actions/workflows/search.yml/badge.svg)](https://git.codejava.tech/codejava/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/codejava/paradigms/actions/workflows/exception.yml/badge.svg)](https://git.codejava.tech/codejava/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.