---
gitea: none
include_toc: true
---
# Тесты к курсу «Введение в программирование»
[Условия домашних заданий](https://www.kgeorgiy.info/courses/prog-intro/homeworks.html)
## Домашнее задание 14. Обработка ошибок
Модификации
* *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* Дополнительно реализуйте бинарные операции (максимальный приоритет):
* `**` – возведение в степень, `2 ** 3` равно 8;
* `//` – логарифм, `10 // 2` равно 3.
* *3839* Дополнительно реализуйте
* бинарные операции (максимальный приоритет):
* `**` – возведение в степень, `2 ** 3` равно 8;
* `//` – логарифм, `10 // 2` равно 3.
* унарные операции:
* `log₂` – логарифм по основанию 2, `log₂ 10` равно 3;
* `pow₂` – два в степени, `pow₂ 4` равно 16.
* *3435* Дополнительно реализуйте унарные операции:
* `log₂` – логарифм по основанию 2, `log₂ 10` равно 3;
* `pow₂` – два в степени, `pow₂ 4` равно 16.
* *3233*
* Дополнительно реализуйте унарные операции:
* `low` – младший установленный бит, `low 123456` равно 64;
* `high` – старший установленный бит, `high 123456` равно 65536.
## Домашнее задание 13. Разбор выражений
Модификации
* *Base*
* Класс `ExpressionParser` должен реализовывать интерфейс
[ListParser](java/expression/parser/ListParser.java)
* Результат разбора должен реализовывать интерфейс
[ListExpression](java/expression/ListExpression.java)
* [Исходный код тестов](java/expression/parser/ParserTest.java)
* Первый аргумент: `easy` или `hard`
* Последующие аргументы: модификации
* *3637*. Дополнительно реализуйте:
* бинарные операции (минимальный приоритет):
* `min` – минимум, `2 min 3` равно 2;
* `max` – максимум, `2 max 3` равно 3.
* унарную операцию
`reverse` – число с переставленными цифрами,
`reverse -12345` равно `-54321`.
* *3839*. * Дополнительно реализуйте:
* бинарные операции (минимальный приоритет):
* `min` – минимум, `2 min 3` равно 2;
* `max` – максимум, `2 max 3` равно 3;
* унарные операции
* `reverse` – число с переставленными цифрами,
`reverse -12345` равно `-54321`;
* `digits` – сумма цифр числа, `digits -12345` равно 15.
* *3435*
* унарные операции
* `floor` – округление вниз до числа кратного 1000,
`floor 1234` равно 1000;
* `ceiling` – округление вверх до числа кратного 1000,
`ceiling 1234` равно 2000.
* бинарные операции (минимальный приоритет):
* `set` – установка бита, `2 set 3` равно 10;
* `clear` – сброс бита, `10 clear 3` равно 2.
* *3233*. Дополнительно реализуйте унарные операции
* `floor` – округление вниз до числа кратного 1000,
`floor 1234` равно 1000;
* `ceiling` – округление вверх до числа кратного 1000,
`ceiling 1234` равно 2000.
## Домашнее задание 12. Выражения
Модификации
* *Base*
* Реализуйте интерфейс [Expression](java/expression/Expression.java)
* [Исходный код тестов](java/expression/ExpressionTest.java)
* Первый аргумент: `easy` или `hard`
* Последующие аргументы: модификации
* *Triple* (32-39)
* Дополнительно реализуйте поддержку выражений с тремя переменными: `x`, `y` и `z`.
* Например, для `expr = new Subtract(new Add(new Variable("x"), new Variable("y")), new Const(1))`:
* `expr.evaluate(2, 3, 5)` должно быть равно 4;
* `expr.toString()` должно быть равно `((x + y) - 1)`.
* Интерфейс/тесты [TripleExpression](java/expression/TripleExpression.java).
* *BigIntegerList* (36, 37). Дополнительно реализуйте поддержку вычисления
выражений в типе `BigInteger` с позиционными переменными.
* Конструктор позиционной переменной получает индекс переменной.
* При выводе позиционная переменная должна иметь вид `$index`.
* Метод вычисления выражения должен называться `evaluateBi`,
ему передаётся список значений переменных.
* Например, для `expr = new Subtract(new Add(new Variable(0), new Variable(1)), new Const(BigInteger.ONE))`:
* `expr.evaluateBi(List.of(BigInteger.TWO, BigInteger.THREE))` должно быть равно 4;
* `expr.toString()` должно быть равно `(($0 + $1) - 1)`.
* Интерфейс/тесты [BigIntegerListExpression](java/expression/BigIntegerListExpression.java).
* *BigDecimalList* (38, 39). Дополнительно реализуйте поддержку вычисления
выражений в типе `BigDecimal` с позиционными переменными.
* Конструктор позиционной переменной получает индекс переменной.
* При выводе позиционная переменная должна иметь вид `$index`.
* Метод вычисления выражения должен называться `evaluateBd`,
ему передаётся список значений переменных.
* Например, для `expr = new Subtract(new Add(new Variable(0), new Variable(1)), new Const(BigDecimal.ONE))`:
* `expr.evaluateBd(List.of(BigDecimal.TWO, BigDecimal.THREE))` должно быть равно 4;
* `expr.toString()` должно быть равно `(($0 + $1) - 1)`.
* Интерфейс/тесты [BigDecimalListExpression](java/expression/BigDecimalListExpression.java).
* *List* (34, 35). Дополнительно реализуйте поддержку выражений вычисления
выражений с позиционными переменными.
* Конструктор позиционной переменной получает индекс переменной.
* При вычислении выражения передаётся список значений переменных.
* При выводе позиционная переменная должна иметь вид `$index`.
* Например, для `expr = new Subtract(new Add(new Variable(0), new Variable(1)), new Const(1))`:
* `expr.evaluate(List.of(2, 3))` должно быть равно 4;
* `expr.toString()` должно быть равно `(($0 + $1) - 1)`.
* Интерфейс/тесты [ListExpression](java/expression/ListExpression.java).
## Домашнее задание 11. Игра m,n,k
Решение должно находиться в пакете `game`.
Модификации
* *Base*
* Тестов не существует, так как они зависят от вашего кода.
* *Двукруговой турнир* (32-39)
* Добавьте поддержку двукругового турнира для нескольких участников.
* В рамках турнира каждый с каждым должен сыграть две партии,
по одной каждым цветом.
* Выведите таблицу очков по схеме:
* 3 очка за победу;
* 1 очко за ничью;
* 0 очков за поражение.
* *Гекс* (36-39)
* Добавьте поддержку ромбической доски для
[игры Гекс](https://ru.wikipedia.org/wiki/Гекс)
(с тремя направлениями линий).
* В качестве примера, сделайте доску размером 11×11.
* *Дополнительные ходы* (34-37)
* Если в результате хода игрока на доске появляется новая последовательность
из 4+ одинаковых символов, то он делает дополнительный ход.
* Игрок не может сделать несколько дополнительных ходов подряд.
* *Multiplayer* (38, 39)
* Добавьте возможность игры для 3 и 4 игроков (значки `@` и `#`);
* Если игрок проигрывает из-за ошибочного хода,
то игра продолжается без него.
Если остался только один игрок, он объявляется победителем.
## Домашнее задание 9. Markdown to HTML
Модификации
* *Base*
* [Исходный код тестов](java/md2html/Md2HtmlTester.java)
* [Откомпилированные тесты](artifacts/Md2HtmlTest.jar)
* Аргументы командной строки: модификации
* *3637*
* Добавьте поддержку
`<<вставок>>`: `вставок` и
`}}удалений{{`: `удалений`
* *3839*
* Добавьте поддержку
\`\`\``кода __без__ форматирования`\`\`\`:
`
кода __без__ форматирования` * *3233* * Добавьте поддержку `%переменных%%`: `переменных` * *3435* * Добавьте поддержку `!!примеров!!`: `примеров` ## Домашнее задание 7. Разметка Модификации * *Base* * Исходный код тестов: * [MarkupTester.java](java/markup/MarkupTester.java) * [MarkupTest.java](java/markup/MarkupTest.java) * Аргументы командной строки: модификации * Откомпилированных тестов не существует, так как они зависят от вашего кода * *3637*, *3839*, *4142*, *4749* * Дополнительно реализуйте метод `toTex`, генерирующий TeX-разметку: * Абзацы предваряются командой `\par{}` * Выделенный текст заключается в `\emph{` и `}` * Сильно выделенный текст заключается в `\textbf{` и `}` * Зачеркнутый текст заключается в `\textst{` и `}` * Добавьте поддержку: * Нумерованных списков (класс `OrderedList`, окружение `enumerate`): последовательность элементов * Ненумерованных списков (класс `UnorderedList`, окружение `itemize`): последовательность элементов * Элементов списка (класс `ListItem`, тег `\item`: последовательность абзацев и списков * Для новых классов поддержка Markdown не требуется * [Исходный код тестов](java/markup/MarkupListTest.java) * *3233*, *3435* * Дополнительно реализуйте метод `toHtml`, генерирующий HTML-разметку: * Абзацы окружаются тегом `p` * Выделенный текст окружается тегом `em` * Сильно выделенный текст окружается тегом `strong` * Зачеркнутый текст окружается тегом `s` ## Домашнее задание 6. Подсчет слов++ Модификации * *Base* * Класс должен иметь имя `Wspp` * Исходный код тестов: [WsppTest.java](java/wspp/WsppTest.java), [WsppTester.java](java/wspp/WsppTester.java) * Откомпилированные тесты: [WsppTest.jar](artifacts/WsppTest.jar) * Аргументы командной строки: модификации * *3637* * В выходном файле слова должны быть упорядочены по возрастанию длины, а при равной длине – по порядку первого вхождения во входной файл * Вместо всех вхождений в файле надо указывать только последнее вхождение в строке * В словах могут дополнительно встречаться цифры и символы `$` и `_` * Класс должен иметь имя `WsppLast` * *3839* * В выходном файле слова должны быть упорядочены по возрастанию длины, а при равной длине – по порядку первого вхождения во входной файл * Вместо всех вхождений в файле надо указывать только среднее вхождение строке * В словах могут дополнительно встречаться цифры и символы `$` и `_` * Класс должен иметь имя `WsppMiddle` * *3435* * В выходном файле слова должны быть упорядочены по возрастанию длины, а при равной длине – по порядку первого вхождения во входной файл * Вместо номеров вхождений во всем файле надо указывать `<номер строки>:<номер вхождения>`, где номер вхождения считается с конца файла * В словах могут дополнительно встречаться цифры и символы `$` и `_` * Класс должен иметь имя `WsppPosition` * *3233* * В выходном файле слова должны быть упорядочены в порядке вхождения во входной файл * Вместо номеров вхождений во всем файле надо указывать `<номер строки>:<номер вхождения>`, где номер вхождения считается с конца файла * В словах могут дополнительно встречаться цифры и символы `$` и `_` * Класс должен иметь имя `WsppPos` * *4142* * В выходном файле слова должны быть упорядочены по возрастанию длины, а при равной длине – по порядку первого вхождения во входной файл * Вместо всех вхождений в файле надо указывать только последнее вхождение в строке * В словах могут дополнительно встречаться цифры и символы `$` и `_` * Класс должен иметь имя `WsppLast` * *4749* * В выходном файле слова должны быть упорядочены по возрастанию длины, а при равной длине – по порядку первого вхождения во входной файл * Вместо номеров вхождений во всем файле надо указывать `<номер строки>:<номер вхождения>`, где номер вхождения считается с конца файла * В словах могут дополнительно встречаться цифры и символы `$` и `_` * Класс должен иметь имя `WsppPosition` ## Домашнее задание 5. Свой сканнер [](https://git.fymio.us/me/prog-intro-2025/actions) Модификации * *Base* * Исходный код тестов: [FastReverseTest.java](java/reverse/FastReverseTest.java) * Откомпилированные тесты: [FastReverseTest.jar](artifacts/FastReverseTest.jar) * Аргументы командной строки: модификации * *3637* * Рассмотрим входные данные как (не полностью определенную) матрицу, вместо каждого числа выведите минимум из чисел, находящихся в его столбце в последующих строках, и его самого * Во вводе могут быть десятичные и восьмиричные числа * Числа дополнительно могут разделяться [открывающими](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Character.html#START_PUNCTUATION) и [закрывающими](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Character.html#END_PUNCTUATION) скобками * Класс должен иметь имя `ReverseMinC` * *3839* * Рассмотрим входные данные как (не полностью определенную) матрицу, вместо каждого числа выведите минимум из чисел текущее число — правый нижний угол матрицы * Во вводе могут быть десятичные и восьмиричные числа * Числа дополнительно могут разделяться [открывающими](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Character.html#START_PUNCTUATION) и [закрывающими](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Character.html#END_PUNCTUATION) скобками * Класс должен иметь имя `ReverseMin` * *3435* * Рассмотрим входные данные как (не полностью определенную) матрицу, выведите ее поворот по часовой стрелке * Числа дополнительно могут разделяться [открывающими](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Character.html#START_PUNCTUATION) и [закрывающими](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Character.html#END_PUNCTUATION) скобками * Класс должен иметь имя `ReverseRotate` * *3233* * Выведите (в реверсивном порядке) только числа, у которых сумма номеров строки и столбца четная * Числа дополнительно могут разделяться [открывающими](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Character.html#START_PUNCTUATION) и [закрывающими](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Character.html#END_PUNCTUATION) скобками * Класс должен иметь имя `ReverseEven` * *4142* * Рассмотрим входные данные как (не полностью определенную) матрицу, вместо каждого числа выведите среднее из чисел в его столбце и строке * Числа дополнительно могут разделяться [открывающими](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Character.html#START_PUNCTUATION) и [закрывающими](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Character.html#END_PUNCTUATION) скобками * Класс должен иметь имя `ReverseAvg` * *4749* * Рассмотрим входные данные как (не полностью определенную) матрицу, вместо каждого числа выведите сумму чиселв его столбце и строке * Числа дополнительно могут разделяться [открывающими](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Character.html#START_PUNCTUATION) и [закрывающими](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Character.html#END_PUNCTUATION) скобками * Класс должен иметь имя `ReverseSum` ## Домашнее задание 4. Подсчет слов [](https://git.fymio.us/me/prog-intro-2025/actions) Модификации * *Base* ✅ * Класс должен иметь имя `WordStat` * Исходный код тестов: [WordStatTest.java](java/wordStat/WordStatTest.java), [WordStatTester.java](java/wordStat/WordStatTester.java), [WordStatChecker.java](java/wordStat/WordStatChecker.java) * Откомпилированные тесты: [WordStatTest.jar](artifacts/WordStatTest.jar) * Аргументы командной строки: модификации * *FastSort* ✅ * Пусть _n_ – число слов во входном файле, тогда программа должна работать за O(_n_ log _n_). * *3637* * Назовём _серединой слова_ подстроку, полученную удалением первых и последних 3 символов слова. Слова длины меньшей 7 игнорируются. * Выходной файл должен содержать все различные середины слов, встречающихся во входном файле, упорядоченные по возрастанию длины (при равенстве – по первому вхождению). * Класс должен иметь имя `WordStatLengthMiddle` * *3839* * Назовём _аффиксами слова_ его префикс и суффикс длины `n / 2`, где `n` — длина слова. Слова длины один игнорируются. * Выходной файл должен содержать все различные аффиксы слов, встречающихся во входном файле, упорядоченные по возрастанию длины (при равенстве – по первому вхождению). * Класс должен иметь имя `WordStatLengthAffix` * *3435* * Назовём _суффиксом слова_ подстроку, состоящую из `n / 2` последних символов слова, где `n` — длина слова. Слова длины один игнорируются. * Выходной файл должен содержать все различные суффиксы слов, встречающихся во входном файле, упорядоченные по возрастанию длины (при равенстве – по первому вхождению). * Класс должен иметь имя `WordStatLengthSuffix` * *3233* ✅ * Выходной файл должен содержать все различные слова встречающиеся во входном файле, упорядоченные по возрастанию длины (при равенстве – по первому вхождению). * Класс должен иметь имя `WordStatLength` * *4142* * Назовём _серединой слова_ подстроку, полученную удалением первых и последних 3 символов слова. Слова длины меньшей 7 игнорируются. * Выходной файл должен содержать все различные середины слов, встречающихся во входном файле, упорядоченные по возрастанию длины (при равенстве – по первому вхождению). * Класс должен иметь имя `WordStatLengthMiddle` * *4749* * Назовём _префиксом слова_ подстроку, состоящую из `n / 2` первых символов слова, где `n` — длина слова. Слова длины один игнорируются. * Выходной файл должен содержать все различные префиксы слов, встречающихся во входном файле, упорядоченные по возрастанию длины (при равенстве – по первому вхождению). * Класс должен иметь имя `WordStatLengthPrefix` ## Домашнее задание 3. Реверс [](https://git.fymio.us/me/prog-intro-2025/actions) Модификации * *Base* ✅ * Исходный код тестов: [ReverseTest.java](java/reverse/ReverseTest.java), [ReverseTester.java](java/reverse/ReverseTester.java) * Откомпилированные тесты: [ReverseTest.jar](artifacts/ReverseTest.jar) * Аргументы командной строки: модификации * *Memory* ✅ * Программа должна сначала считывать все данные в память, и только потом обрабатывать их. * Пусть _M_ – объём памяти, необходимый для сохранения ввода в двумерном массиве `int` минимального размера. Ваша программа должна использовать не более 4_M_ + 1024 байт памяти. * Накладные расходы на запуск вашей программы JVM не учитываются. * *3637* ✅ * Рассмотрим входные данные как (не полностью определенную) матрицу, вместо каждого числа выведите максимум из чисел, находящихся в его столбце в последующих строках, и его самого * Класс должен иметь имя `ReverseMaxC` * *3839* * Рассмотрим входные данные как (не полностью определенную) матрицу, вместо каждого числа выведите максимум из чисел текущее число — правый нижний угол матрицы * Класс должен иметь имя `ReverseMax` * *3435* ✅ * Рассмотрим входные данные как (не полностью определенную) матрицу, выведите ее поворот по часовой стрелке, например для ввода ``` 1 2 3 4 5 6 7 8 9 ``` вывод должен быть ``` 7 5 1 8 6 2 9 3 4 ``` * Класс должен иметь имя `ReverseRotate` * *3233* ✅ * Выведите (в реверсивном порядке) только числа, у которых сумма номеров строки и столбца четная * Класс должен иметь имя `ReverseEven` * *4142* ✅ * Рассмотрим входные данные как (не полностью определенную) матрицу, вместо каждого числа выведите среднее из чисел в его столбце и строке * Класс должен иметь имя `ReverseAvg` * *4749* ❌ * Рассмотрим входные данные как (не полностью определенную) матрицу, вместо каждого числа выведите сумму чиселв его столбце и строке * Класс должен иметь имя `ReverseSum` ## Домашнее задание 2. Сумма чисел [](https://git.fymio.us/me/prog-intro-2025/actions) Модификации * *Base* ✅ * Исходный код тестов: [SumTest.java](java/sum/SumTest.java), [SumTester.java](java/sum/SumTester.java), [базовые классы](java/base/) * Откомпилированные тесты: [SumTest.jar](artifacts/SumTest.jar) * Аргументы командной строки: модификации * *3637* ✅ * Входные данные являются 64-битными числами в формате с плавающей точкой * На вход подаются десятичные и шестнадцатеричные числа * Шестнадцатеричные числа имеют префикс `0x`, например `0xa.bp2` равно (10+11/16)·4 равно 42.75 * Ввод регистронезависим * Класс должен иметь имя `SumDoubleHex` * *3839* ✅ * Входные данные помещаются в тип [BigDecimal](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/math/BigDecimal.html) * На вход подаются десятичные и шестнадцатеричные числа * Шестнадцатеричные числа имеют префикс `0x`, например `0xbsc` равно 11·10⁻¹² (мантисса и порядок являются целыми числами) * Ввод регистронезависим * Класс должен иметь имя `SumBigDecimalHex` * *3435* ✅ * На вход подаются десятичные и шестнадцатеричные числа * Шестнадцатеричные числа имеют префикс `0x` * Ввод регистронезависим * Класс должен иметь имя `SumHex` * *3233* ✅ * Входные данные являются 64-битными числами в формате с плавающей точкой * Класс должен иметь имя `SumDouble` * *4142* ✅ * Входные данные помещаются в тип [BigInteger](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/math/BigInteger.html) * восьмеричные числа имеют суффикс `o` * Класс должен иметь имя `SumBigIntegerOctal` * *4749* ✅ * Входные данные являются 64-битными целыми числами * восьмеричные числа имеют суффикс `o` * Класс должен иметь имя `SumLongOctal`