--- 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. Свой сканнер [![Fast Reverse Tests](https://git.fymio.us/me/prog-intro-2025/actions/workflows/fast-reverse.yml/badge.svg)](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. Подсчет слов Модификации * *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. Реверс [![Reverse Tests](https://git.fymio.us/me/prog-intro-2025/actions/workflows/reverse.yml/badge.svg)](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. Сумма чисел [![Sum Tests](https://git.fymio.us/me/prog-intro-2025/actions/workflows/sum.yml/badge.svg)](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` Для того, чтобы протестировать программу: 1. Скачайте откомпилированные тесты ([SumTest.jar](artifacts/SumTest.jar)) 1. Откомпилируйте `Sum.java` 1. Проверьте, что создался `Sum.class` 1. В каталоге, в котором находится `Sum.class`, выполните команду ``` java -ea -jar <путь к SumTest.jar> Base ``` * Например, если `SumTest.jar` находится в текущем каталоге, выполните команду ``` java -ea -jar SumTest.jar Base ``` 1. Для ускорения отладки рекомендуется сделать скрипт, выполняющий шаги 2−4. ## Домашнее задание 1. Запусти меня! Модификации * *RunMe* 1. Скачайте исходный код [RunMe.java](java/RunMe.java). 1. Создайте скрипт, компилирующий и запускающий `RunMe` из командной строки с выданными вам аргументами командной строки. 1. Следуйте выведенной инструкции. Рекомендации по выполнению модификации 1. Проверьте версию Java: 1. Запустите `javac --version` и проверьте, что версия находится в диапазоне 21..24. 1. Запустите `java --version` и проверьте, что версия такая же как и у `javac`. 1. Скачайте [RunMe.java](java/RunMe.java) 1. Откомпилируйте `RunMe.java`: 1. Запустите `javac RunMe.java` 1. Убедитесь, что компиляция завершилась без ошибок 1. Проверьте, что появился `RunMe.class` 1. Запустите `RunMe`: 1. Запустите `java RunMe [шесть] [слов] [пароля] [пришедшего] [на] [email]` 1. При правильном исполнении вы должны получить ссылку. Если получено сообщение об ошибке — исправьте её и запустите повторно 1. Зайдите по полученной ссылке и убедитесь, что она правильная 1. Напишите и протестируйте скрипт: 1. Напишите скрипт, включающий команды компиляции и запуска. Если вы не умеете писать скрипты, воспользуйтесь одной из инструкций: [Windows](https://tutorialreference.com/batch-scripting/batch-script-files), [Linux](https://www.freecodecamp.org/news/shell-scripting-crash-course-how-to-write-bash-scripts-in-linux/), [macOS](https://rowannicholls.github.io/bash/intro/myscript.html) 1. Запустите и проверьте, что вы получили ту же ссылку, что и в предыдущем пункте 1. Сдайте скрипт преподавателю 1. Вы можете получить больше плюсиков, модифицируя код `RunMe.java`