Files
prog-intro-2025/README.md
me 971119da82
Some checks failed
Fast Reverse Tests / test (push) Failing after 4s
Reverse Tests / test (push) Failing after 4s
Sum Tests / test (push) Failing after 4s
Word Stat Tests / test (push) Failing after 4s
add solution for hw4:3435
2026-01-31 15:37:58 +05:00

554 lines
37 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/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*
* Добавьте поддержку
`<<вставок>>`: `<ins>вставок</ins>` и
`}}удалений{{`: `<del>удалений</del>`
* *3839*
* Добавьте поддержку
\`\`\``кода __без__ форматирования`\`\`\`:
`<pre>кода __без__ форматирования</pre>`
* *3233*
* Добавьте поддержку `%переменных%%`: `<var>переменных</var>`
* *3435*
* Добавьте поддержку `!!примеров!!`: `<samp>примеров</samp>`
## Домашнее задание 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. Подсчет слов [![Word Stat](https://git.fymio.us/me/prog-intro-2025/actions/workflows/word-stat.yml/badge.svg)](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. Реверс [![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. Для ускорения отладки рекомендуется сделать скрипт, выполняющий шаги 24.
## Домашнее задание 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`
-->