commit fb1ce36970dc985822c940d832a3b4946734bb85 Author: me Date: Thu Jan 29 23:19:54 2026 +0500 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..3c0a159 --- /dev/null +++ b/README.md @@ -0,0 +1,550 @@ +--- +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. Свой сканнер + +Модификации + * *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. Реверс + +Модификации + * *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. Сумма чисел + +Модификации + * *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`