commit c396a5ccddaa366740d863b9dbc7d49a5dd62fe2 Author: codejava Date: Mon Apr 13 10:23:40 2026 +0300 Upload files to "/" diff --git a/README.md b/README.md new file mode 100644 index 0000000..075714a --- /dev/null +++ b/README.md @@ -0,0 +1,559 @@ +--- +gitea: none +include_toc: true +--- + +# Тесты к курсу «Введение в программирование» + +[Условия домашних заданий](https://www.kgeorgiy.info/courses/prog-intro/homeworks.html) + + +## Домашнее задание 14. Обработка ошибок [![Exception Tests](https://git.fym.su/code.java/prog-intro/actions/workflows/exception.yml/badge.svg)](https://git.fym.su/code.java/prog-intro/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* ✅ Дополнительно реализуйте бинарные операции (максимальный приоритет): + * `**` – возведение в степень, `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. Разбор выражений [![Expression Parser Tests](https://git.fym.su/code.java/prog-intro/actions/workflows/expression-parser.yml/badge.svg)](https://git.fym.su/code.java/prog-intro/actions) + + +Модификации + * *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. Выражения [![Expression Tests](https://git.fym.su/code.java/prog-intro/actions/workflows/expression.yml/badge.svg)](https://git.fym.su/code.java/prog-intro/actions) + +Модификации +* *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). + +## Домашнее задание 9. Markdown to HTML [![Markdown to HTML Tests](https://git.fym.su/code.java/prog-intro/actions/workflows/md2html.yml/badge.svg)](https://git.fym.su/code.java/prog-intro/actions) + +Модификации + * *Base* ✅ + * [Исходный код тестов](java/md2html/Md2HtmlTester.java) + * [Откомпилированные тесты](artifacts/Md2HtmlTest.jar) + * Аргументы командной строки: модификации + * *3637* + * Добавьте поддержку + `<<вставок>>`: `вставок` и + `}}удалений{{`: `удалений` + * *3839* + * Добавьте поддержку + \`\`\``кода __без__ форматирования`\`\`\`: + `
кода __без__ форматирования
` + * *3233* + * Добавьте поддержку `%переменных%%`: `переменных` + * *3435* + * Добавьте поддержку `!!примеров!!`: `примеров` + + +## Домашнее задание 7. Разметка [![Markup Tests](https://git.fym.su/code.java/prog-intro/actions/workflows/markup.yml/badge.svg)](https://git.fym.su/code.java/prog-intro/actions) + +Модификации + * *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. Подсчет слов++ [![Word Stat++ Tests](https://git.fym.su/code.java/prog-intro/actions/workflows/wspp.yml/badge.svg)](https://git.fym.su/code.java/prog-intro/actions) + +Модификации + * *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` + + + +## Домашнее задание 4. Подсчет слов [![Word Stat](https://git.fym.su/code.java/prog-intro/actions/workflows/word-stat.yml/badge.svg)](https://git.fym.su/code.java/prog-intro/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.fym.su/code.java/prog-intro/actions/workflows/reverse.yml/badge.svg)](https://git.fym.su/code.java/prog-intro/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.fym.su/code.java/prog-intro/actions/workflows/sum.yml/badge.svg)](https://git.fym.su/code.java/prog-intro/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` + diff --git a/test-rules.md b/test-rules.md new file mode 100644 index 0000000..6e0fdf5 --- /dev/null +++ b/test-rules.md @@ -0,0 +1,113 @@ +--- +gitea: none +include_toc: true +--- + +# Зачёт по дисциплине «Введение в программирование» + +## Расписание + +Досрочная сдача зачёта: + + * M3132-35: 30 декабря с 11:30, ауд. 2137 + * M3136-39: 30 декабря с 11:30, ауд. 2137 + +Сдача зачёта в сессию: + +* M3132-35: 10 января с 11:30, ауд. 1229 +* M3136-39: 20 января с 11:30, ауд. 2137 + + +Пересдача зачёта пройдёт: + +* M3132-39: TBA +* M3136-39: TBA + + +## Сдача зачёта + +Если вас устраивают ваши баллы, то зачёт можно не сдавать. +Вы можете сдавать зачёт либо досрочно, либо во время сессии, по вашему выбору. + +Для того, чтобы записаться на сдачу зачёта надо заполнить +[форму](https://docs.google.com/forms/d/e/1FAIpQLScjft8hZCjlfoeVicSJHnX_uMW7xpA5RxSMQwqhy6aXGZWCGw/viewform). +Для заполнения вам потребуются логин и пароль от репозитория. +Если не указано обратного, то на сдачу надо записаться до 9:00 дня сдачи. +Если вы не записались на сдачу вовремя, то вы можете прийти на зачёт, +но вы будете обработаны в ручном режиме после решения проблем всех записавшихся вовремя. +Время на обработку компенсировано не будет. + +Если у вас больше 59 баллов, то их округлят до 60 если вы заполните форму +и пообещаете не сдавать зачёт (это требуется отметить в форме). + + +## Формат заданий + +Вам будет выдано задание, связанное с пройденными темами. +В условии описано, что вам надо сделать и набор требований, +которым должно удовлетворять решение (примерно как в домашних заданиях). + +Некоторые задания рассчитаны на то, что вы адаптируте или скомпануете +код одного или нескольких ДЗ. +Если вы не сдали соответствующие ДЗ, то вы можете написать весь код с нуля, +но это будет сложнее. + +Если вам что-то не ясно в задании (например, оно кажется подозрительно простым), +то вы можете задать вопрос по условию. +Принимаются только вопросы о том, что надо сделать. +Как именно делать остаётся на ваше усмотрение. + +По решению должно быть очевидно как его запускать. +Например, назвать основной класс `Main` или по имени задания — +хорошая идея, а `FooBazFactoryProvider` — нет. + +Если вы хотете передать проверяющему какую-то дополнительную информацию +(например, о выбранном компромиссе между памятью и временем исполнения), +то напишите её либо в комментариях к коду, либо положите рядом с кодом +`README.md`. + +В решении вы можете использовать ваш код из ДЗ и код, +написанный преподавателями на лекциях. + + +## Порядок сдачи + + 1. Заранее проверьте, что у вас работает всё, необходимое для сдачи. + Претензии вида «у меня не работал компилятор/IDE/git/браузер/интернет» не принимаются. + 1. За 10 минут до начала зачёта сбор студентов в соответствующей аудитории. + Позаботьтесь, что бы вам хватило заряда ноутбука или принесите с собой удлинитель-тройник. + 1. Организационные вопросы. + В том числе, можно отказаться от участия, если записались по ошибке, + или вам больше не актуально. + 1. В момент *T* объявляется начало и выдаются билеты с заданиями. + 1. Ответы на вопросы по билетам до *T*+30 минут. + 1. Вы пишите решение и записываете его в каталог `java-solutions` зачётного репозитория + `https://www.kgeorgiy.info/git-students/year2025//prog-intro-exam`. + 1. В момент времени *T*+3 часа фиксируется состояние репозиториев. + 1. Проверяется код на состояние *T*+3 часа. Это может занять несколько дней. + 1. Результаты проверки отображаются в табличке, + комментарии по проверке загружаются в репозитории. + + +## Система оценки + +В репозитории есть код, решающий поставленную задачу (возможно не всю): +`20` баллов минус баллы за проблемы: + + * `#` — большая проблема (обычно не выполнено одно из требований задания): `−5` баллов + * `*` — средняя проблема (обычно нарушение неоднократно обсуждавшихся рекомендаций, + например, утечка ресурсов, если это не является основной целью задания): `−2` балла + * `-` — маленькая проблема (например, однократное нарушение правил оформления кода): `−1` балл + +Код (почти) отсутствует/не имеет отношения к заданию, преподаватель не нашёл ваш код: `−5` баллов + +Код не компилируется/синтаксически некорректен: `−10` баллов, дальнейшая проверка не осуществляется. + +Код списан: `−20` баллов + + +## Полезные ссылки + + 1. [Форма для записи на зачет](https://docs.google.com/forms/d/e/1FAIpQLScjft8hZCjlfoeVicSJHnX_uMW7xpA5RxSMQwqhy6aXGZWCGw/viewform) + 1. [Результаты записи на зачет](https://docs.google.com/spreadsheets/d/1g1XA_62KxWQHjXHsGoEAg0nisYQGZ_amLPVWXH_ftEA/edit?gid=1533773578#gid=1533773578) + 1. Экзаменационный репозиторий: `https://www.kgeorgiy.info/git-students/year2025//prog-intro-exam`