# Тесты к курсу «Парадигмы программирования»

[Условия домашних заданий](https://www.kgeorgiy.info/courses/paradigms/homeworks.html)

## Домашнее задание 9. Линейная алгебра на Clojure [![Clojure Linear Tests](https://git.fym.su/code.java/paradigms/actions/workflows/clj-linear.yml/badge.svg)](https://git.fym.su/code.java/paradigms/actions)

Модификации
 * *Базовая* ✅
    * Код должен находиться в файле `clojure-solutions/linear.clj`.
    * [Исходный код тестов](clojure/cljtest/linear/LinearTest.java)
        * Запускать с указанием сложности (`easy` или `hard`) и модификации.


## Исходный код к лекциям по Clojure

Документация
 * [Clojure Reference](https://clojure.org/reference/documentation)
 * [Clojure Cheat Sheet](https://clojure.org/api/cheatsheet)

Запуск Clojure
 * Консоль: [Windows](clojure/RunClojure.cmd), [*nix](clojure/RunClojure.sh)
    * Интерактивный: `RunClojure`
    * С выражением: `RunClojure --eval "<выражение>"`
    * Скрипт: `RunClojure <файл скрипта>`
    * Справка: `RunClojure --help`
 * IDE
    * IntelliJ Idea: [плагин Cursive](https://cursive-ide.com/userguide/)
    * VSCode: [плагин Calva](https://calva.io/)

[Скрипт со всеми примерами](clojure/examples.clj)

Лекция 1. Функции
 * [Введение](clojure/examples/1_1_intro.clj)
 * [Функции](clojure/examples/1_2_functions.clj)
 * [Списки](clojure/examples/1_3_lists.clj)
 * [Вектора](clojure/examples/1_4_vectors.clj)
 * [Функции высшего порядка](clojure/examples/1_5_functions-2.clj)

Лекция 2. Внешний мир
 * [Ввод-вывод](clojure/examples/2_1_io.clj)
 * [Разбор и гомоиконность](clojure/examples/2_2_read.clj)
 * [Порядки вычислений](clojure/examples/2_3_evaluation-orders.clj)
 * [Потоки](clojure/examples/2_4_streams.clj)
 * [Отображения и множества](clojure/examples/2_5_maps.clj)


## Тестовое задание на Clojure [![Clojure Exmaple Tests](https://git.fym.su/code.java/paradigms/actions/workflows/clj-example.yml/badge.svg)](https://git.fym.su/code.java/paradigms/actions)

Это задание предназначено для проверки правильности настройки Clojure.
Вам надо убедиться, что оно успешно проверяется на вашем компьютере.

Для запуска тестов используются скрипты
[TestClojure.cmd](clojure/TestClojure.cmd) и [TestClojure.sh](clojure/TestClojure.sh)
 * Репозиторий должен быть скачан целиком.
 * Скрипты должны находиться в каталоге `clojure`
    (их нельзя перемещать, но можно вызывать из других каталогов).
 * Тестируемое решение должно находиться в текущем каталоге.
 * В качестве аргументов командной строки указывается
   полное имя класса теста, сложность и модификация,
   например, `cljtest.example.ExampleTest hard base`.

Модификации
 * *base* ✅
    * Код решения `clojure-solutions/example.clj` в
      [репозитории решений](https://www.kgeorgiy.info/git/geo/paradigms-2026-students/).
      Если всё настроено верно, то вам достаточно сделать
      `git pull source main` в своём репозитории,
      чтобы получить решение.
    * [Исходный код тестов](clojure/cljtest/example/ExampleTest.java)
        * Запускать с аргументом `hard` или `easy`.


## Домашнее задание 8. Обработка ошибок на JavaScript [![JavaScript Prefix Tests](https://git.fym.su/code.java/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.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.
 * *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.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.
