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
336 lines
25 KiB
Markdown
336 lines
25 KiB
Markdown
---
|
||
gitea: none
|
||
include_toc: true
|
||
---
|
||
|
||
# Тесты к курсу «Парадигмы программирования»
|
||
|
||
[Условия домашних заданий](https://www.kgeorgiy.info/courses/paradigms/homeworks.html)
|
||
|
||
## Домашнее задание 9. Линейная алгебра на Clojure [](https://git.codejava.tech/codejava/paradigms/actions)
|
||
|
||
Модификации
|
||
* *Базовая* ✅
|
||
* Код должен находиться в файле `clojure-solutions/linear.clj`.
|
||
* [Исходный код тестов](clojure/cljtest/linear/LinearTest.java)
|
||
* Запускать с указанием сложности (`easy` или `hard`) и модификации.
|
||
|
||
|
||
## Домашнее задание 8. Обработка ошибок на JavaScript [](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 [](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 [](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. Вычисления в различных типах [](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. Очереди [](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. Очередь на массиве [](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. Бинарный поиск [](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. Обработка ошибок [](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.
|