← Все проекты уровня 2
Уровень 2 · Работа с текстом и файламиВариант B

Статистика субтитров

Разберите SRT, подсчитайте Unicode-слова и длительность показа с явным правилом пересечений.

Техническое задание

Формат и расчёты

Напишите CLI-программу, которая принимает путь к SRT-файлу и строит статистику субтитров. Поддерживайте UTF-8-файлы размером не более 50 MiB и максимальной длиной строки 1 MiB. Формат cue: целый положительный номер, следующая строка со временем HH:MM:SS,mmm --> HH:MM:SS,mmm, затем одна или несколько строк текста и пустая строка либо конец файла. Часы могут превышать 23. Сохраняйте текст cue без HTML-разметки как исходное сообщение, но при подсчёте слов рассматривайте Unicode-буквы и цифры как части слова. Апостроф и дефис внутри слова допустимы только между буквами или цифрами; знаки препинания вокруг слова разделителями не считаются словами.

Проверьте строго возрастающую последовательность положительных номеров cue; пропуски номеров разрешены. Проверьте формат и порядок времён, наличие хотя бы одной непустой строки текста и корректность UTF-8. Строка только из знаков препинания допустима и даёт ноль слов. Для каждого cue длительность равна концу минус началу; конец обязан быть позже начала. Общая длительность показа определяется как сумма длительностей всех cue, а не длительность объединения временных интервалов: перекрывающиеся субтитры считаются отдельно. В отчёте выведите число cue, число Unicode-слов, суммарную длительность в миллисекундах и длительность в формате часов, минут, секунд и миллисекунд. Покажите cue с максимальным числом слов; при равенстве выбирайте первый cue по файлу. Для текста без букв и цифр результат по словам — ноль.

Любая структурная ошибка делает весь файл некорректным: выведите строку или номер cue, не формируйте частичную статистику и верните ненулевой код. Неизвестный флаг, отсутствие пути, нечитаемый файл и неверная кодировка также являются ошибками. Превышение лимита строки или файла является фатальной ошибкой с указанием причины. Не переписывайте SRT и не подключайте внешние библиотеки или сервисы.

Структура программы

Пусть main.go отвечает за аргументы, открытие SRT, вызов анализа и ошибки процесса. В отдельных функциях package main реализуйте разбор cue, подсчёт Unicode-слов и суммирование длительностей; форматирование статистики вынесите отдельно. Передавайте текст функциям анализа, чтобы проверять cue и временные правила без main и файлов.

Критерии готовности

Ожидаемый результат

В корне разместите запускаемый Go-модуль, README о поддерживаемом подмножестве SRT и автономные тесты парсинга, подсчёта Unicode-токенов и времён. Документация обязана прямо говорить, что длительности перекрывающихся cue суммируются, а правило выбора самого многословного cue при равенстве оставляет первый.

Критерии приёмки:

  • README описывает парсер и расчёт отдельно; cue и подсчёт слов тестируются без main.go.
  • один cue от 1,000 до 3,500 длится 2500 мс;
  • два перекрывающихся интервала по 2 секунды дают сумму 4000 мс;
  • строка «Привет, мир!» содержит два слова;
  • время cue с 27 часами корректно разбирается;
  • при одинаковом количестве слов выбран первый cue. Неположительный номер, повтор номера, конец до начала, отсутствие текста, сломанная временная строка и некорректный UTF-8 приводят к диагностике и ненулевому завершению без частичного отчёта.

Для ориентира

Примеры входа и результата

Один cue 00:00:01,000 --> 00:00:03,500, текст «Привет, мир!»: 1 cue, 2 слова, 2500 мс. Два cue длительностью 2000 мс каждый с перекрытием в 500 мс: суммарная длительность 4000 мс.