Files
prog-intro-2025/README.md
2026-01-29 23:19:54 +05:00

36 KiB
Raw Blame History

Table of Contents

Тесты к курсу «Введение в программирование»

Условия домашних заданий

Домашнее задание 14. Обработка ошибок

Модификации

  • Base
    • Класс ExpressionParser должен реализовывать интерфейс ListParser.
    • Результат разбора должен реализовывать интерфейс ListExpression.
    • Нельзя использовать типы long и double
    • Нельзя использовать методы классов Math и StrictMath
    • Исходный код тестов
      • Первый аргумент: 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
    • Результат разбора должен реализовывать интерфейс ListExpression
    • Исходный код тестов
      • Первый аргумент: 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
  • 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.
  • 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.
  • 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.
  • 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.

Домашнее задание 11. Игра m,n,k

Решение должно находиться в пакете game.

Модификации

  • Base
    • Тестов не существует, так как они зависят от вашего кода.
  • Двукруговой турнир (32-39)
    • Добавьте поддержку двукругового турнира для нескольких участников.
    • В рамках турнира каждый с каждым должен сыграть две партии, по одной каждым цветом.
    • Выведите таблицу очков по схеме:
      • 3 очка за победу;
      • 1 очко за ничью;
      • 0 очков за поражение.
  • Гекс (36-39)
    • Добавьте поддержку ромбической доски для игры Гекс (с тремя направлениями линий).
    • В качестве примера, сделайте доску размером 11×11.
  • Дополнительные ходы (34-37)
    • Если в результате хода игрока на доске появляется новая последовательность из 4+ одинаковых символов, то он делает дополнительный ход.
    • Игрок не может сделать несколько дополнительных ходов подряд.
  • Multiplayer (38, 39)
    • Добавьте возможность игры для 3 и 4 игроков (значки @ и #);
    • Если игрок проигрывает из-за ошибочного хода, то игра продолжается без него. Если остался только один игрок, он объявляется победителем.

Домашнее задание 9. Markdown to HTML

Модификации

  • Base
  • 3637
    • Добавьте поддержку <<вставок>>: <ins>вставок</ins> и }}удалений{{: <del>удалений</del>
  • 3839
    • Добавьте поддержку ```кода __без__ форматирования```: <pre>кода __без__ форматирования</pre>
  • 3233
    • Добавьте поддержку %переменных%%: <var>переменных</var>
  • 3435
    • Добавьте поддержку !!примеров!!: <samp>примеров</samp>

Домашнее задание 7. Разметка

Модификации

  • Base
    • Исходный код тестов:
    • Откомпилированных тестов не существует, так как они зависят от вашего кода
  • 3637, 3839, 4142, 4749
    • Дополнительно реализуйте метод toTex, генерирующий TeX-разметку:
      • Абзацы предваряются командой \par{}
      • Выделенный текст заключается в \emph{ и }
      • Сильно выделенный текст заключается в \textbf{ и }
      • Зачеркнутый текст заключается в \textst{ и }
    • Добавьте поддержку:
      • Нумерованных списков (класс OrderedList, окружение enumerate): последовательность элементов
      • Ненумерованных списков (класс UnorderedList, окружение itemize): последовательность элементов
      • Элементов списка (класс ListItem, тег \item: последовательность абзацев и списков
    • Для новых классов поддержка Markdown не требуется
    • Исходный код тестов
  • 3233, 3435
    • Дополнительно реализуйте метод toHtml, генерирующий HTML-разметку:
      • Абзацы окружаются тегом p
      • Выделенный текст окружается тегом em
      • Сильно выделенный текст окружается тегом strong
      • Зачеркнутый текст окружается тегом s

Домашнее задание 6. Подсчет слов++

Модификации

  • Base
    • Класс должен иметь имя Wspp
    • Исходный код тестов: WsppTest.java, WsppTester.java
    • Откомпилированные тесты: WsppTest.jar
      • Аргументы командной строки: модификации
  • 3637
    • В выходном файле слова должны быть упорядочены по возрастанию длины, а при равной длине по порядку первого вхождения во входной файл
    • Вместо всех вхождений в файле надо указывать только последнее вхождение в строке
    • В словах могут дополнительно встречаться цифры и символы $ и _
    • Класс должен иметь имя WsppLast
  • 3839
    • В выходном файле слова должны быть упорядочены по возрастанию длины, а при равной длине по порядку первого вхождения во входной файл
    • Вместо всех вхождений в файле надо указывать только среднее вхождение строке
    • В словах могут дополнительно встречаться цифры и символы $ и _
    • Класс должен иметь имя WsppMiddle
  • 3435
    • В выходном файле слова должны быть упорядочены по возрастанию длины, а при равной длине по порядку первого вхождения во входной файл
    • Вместо номеров вхождений во всем файле надо указывать <номер строки>:<номер вхождения>, где номер вхождения считается с конца файла
    • В словах могут дополнительно встречаться цифры и символы $ и _
    • Класс должен иметь имя WsppPosition
  • 3233
    • В выходном файле слова должны быть упорядочены в порядке вхождения во входной файл
    • Вместо номеров вхождений во всем файле надо указывать <номер строки>:<номер вхождения>, где номер вхождения считается с конца файла
    • В словах могут дополнительно встречаться цифры и символы $ и _
    • Класс должен иметь имя WsppPos
  • 4142
    • В выходном файле слова должны быть упорядочены по возрастанию длины, а при равной длине по порядку первого вхождения во входной файл
    • Вместо всех вхождений в файле надо указывать только последнее вхождение в строке
    • В словах могут дополнительно встречаться цифры и символы $ и _
    • Класс должен иметь имя WsppLast
  • 4749
    • В выходном файле слова должны быть упорядочены по возрастанию длины, а при равной длине по порядку первого вхождения во входной файл
    • Вместо номеров вхождений во всем файле надо указывать <номер строки>:<номер вхождения>, где номер вхождения считается с конца файла
    • В словах могут дополнительно встречаться цифры и символы $ и _
    • Класс должен иметь имя WsppPosition

Домашнее задание 5. Свой сканнер

Модификации

  • Base
    • Исходный код тестов: FastReverseTest.java
    • Откомпилированные тесты: FastReverseTest.jar
      • Аргументы командной строки: модификации
  • 3637
    • Рассмотрим входные данные как (не полностью определенную) матрицу, вместо каждого числа выведите минимум из чисел, находящихся в его столбце в последующих строках, и его самого
    • Во вводе могут быть десятичные и восьмиричные числа
    • Числа дополнительно могут разделяться открывающими и закрывающими скобками
    • Класс должен иметь имя ReverseMinC
  • 3839
    • Рассмотрим входные данные как (не полностью определенную) матрицу, вместо каждого числа выведите минимум из чисел текущее число — правый нижний угол матрицы
    • Во вводе могут быть десятичные и восьмиричные числа
    • Числа дополнительно могут разделяться открывающими и закрывающими скобками
    • Класс должен иметь имя ReverseMin
  • 3435
    • Рассмотрим входные данные как (не полностью определенную) матрицу, выведите ее поворот по часовой стрелке
    • Числа дополнительно могут разделяться открывающими и закрывающими скобками
    • Класс должен иметь имя ReverseRotate
  • 3233
    • Выведите (в реверсивном порядке) только числа, у которых сумма номеров строки и столбца четная
    • Числа дополнительно могут разделяться открывающими и закрывающими скобками
    • Класс должен иметь имя ReverseEven
  • 4142
    • Рассмотрим входные данные как (не полностью определенную) матрицу, вместо каждого числа выведите среднее из чисел в его столбце и строке
    • Числа дополнительно могут разделяться открывающими и закрывающими скобками
    • Класс должен иметь имя ReverseAvg
  • 4749
    • Рассмотрим входные данные как (не полностью определенную) матрицу, вместо каждого числа выведите сумму чиселв его столбце и строке
    • Числа дополнительно могут разделяться открывающими и закрывающими скобками
    • Класс должен иметь имя ReverseSum

Домашнее задание 4. Подсчет слов

Модификации

  • Base
  • 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
  • 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
  • 3637
    • Входные данные являются 64-битными числами в формате с плавающей точкой
    • На вход подаются десятичные и шестнадцатеричные числа
    • Шестнадцатеричные числа имеют префикс 0x, например 0xa.bp2 равно (10+11/16)·4 равно 42.75
    • Ввод регистронезависим
    • Класс должен иметь имя SumDoubleHex
  • 3839
    • Входные данные помещаются в тип BigDecimal
    • На вход подаются десятичные и шестнадцатеричные числа
    • Шестнадцатеричные числа имеют префикс 0x, например 0xbsc равно 11·10⁻¹² (мантисса и порядок являются целыми числами)
    • Ввод регистронезависим
    • Класс должен иметь имя SumBigDecimalHex
  • 3435
    • На вход подаются десятичные и шестнадцатеричные числа
    • Шестнадцатеричные числа имеют префикс 0x
    • Ввод регистронезависим
    • Класс должен иметь имя SumHex
  • 3233
    • Входные данные являются 64-битными числами в формате с плавающей точкой
    • Класс должен иметь имя SumDouble
  • 4142
    • Входные данные помещаются в тип BigInteger
    • восьмеричные числа имеют суффикс o
    • Класс должен иметь имя SumBigIntegerOctal
  • 4749
    • Входные данные являются 64-битными целыми числами
    • восьмеричные числа имеют суффикс o
    • Класс должен иметь имя SumLongOctal

Для того, чтобы протестировать программу:

  1. Скачайте откомпилированные тесты (SumTest.jar)
  2. Откомпилируйте Sum.java
  3. Проверьте, что создался Sum.class
  4. В каталоге, в котором находится Sum.class, выполните команду
       java -ea -jar <путь к SumTest.jar> Base
    
    • Например, если SumTest.jar находится в текущем каталоге, выполните команду
        java -ea -jar SumTest.jar Base
    
  5. Для ускорения отладки рекомендуется сделать скрипт, выполняющий шаги 24.

Домашнее задание 1. Запусти меня!

Модификации

  • RunMe
    1. Скачайте исходный код RunMe.java.
    2. Создайте скрипт, компилирующий и запускающий RunMe из командной строки с выданными вам аргументами командной строки.
    3. Следуйте выведенной инструкции.

Рекомендации по выполнению модификации

  1. Проверьте версию Java:
    1. Запустите javac --version и проверьте, что версия находится в диапазоне 21..24.
    2. Запустите java --version и проверьте, что версия такая же как и у javac.
  2. Скачайте RunMe.java
  3. Откомпилируйте RunMe.java:
    1. Запустите javac RunMe.java
    2. Убедитесь, что компиляция завершилась без ошибок
    3. Проверьте, что появился RunMe.class
  4. Запустите RunMe:
    1. Запустите java RunMe [шесть] [слов] [пароля] [пришедшего] [на] [email]
    2. При правильном исполнении вы должны получить ссылку. Если получено сообщение об ошибке — исправьте её и запустите повторно
    3. Зайдите по полученной ссылке и убедитесь, что она правильная
  5. Напишите и протестируйте скрипт:
    1. Напишите скрипт, включающий команды компиляции и запуска. Если вы не умеете писать скрипты, воспользуйтесь одной из инструкций: Windows, Linux, macOS
    2. Запустите и проверьте, что вы получили ту же ссылку, что и в предыдущем пункте
    3. Сдайте скрипт преподавателю
  6. Вы можете получить больше плюсиков, модифицируя код RunMe.java