Скользящее окно Python: найдите кратчайшую подстроку с тремя символами
Напишите решение на Python и проверьте его на странице.
Другие упражнения по этой теме: Collections в Python: задачи на ChainMap, defaultdict и deque.
Печать книжной гильдии
В мастерской книжной гильдии готовят личные печати для редких рукописей. Резчик берёт заготовку с цепочкой декоративных знаков и вырезает из неё один непрерывный кусок. На готовом оттиске должны присутствовать все три именные руны мастера, каждая ровно один раз. Любые другие знаки могут встречаться между ними или вокруг в каком угодно количестве.
Мастер бережёт материал и ищет самый короткий подходящий фрагмент. Если таких участков наименьшей длины окажется несколько, резчик выбирает тот, который находится ближе к началу заготовки.
Определите положение и длину выбранного для печати фрагмента.
Что уже дано
В заготовке программы уже подключён класс Counter из модуля collections и прочитаны две строки с помощью input():
runes— строка из трёх именных рун;blank— строка-заготовка с цепочкой знаков.
Никаких других предварительных переменных или скрытых файлов нет.
Что нужно сделать
Допишите тело скрипта так, чтобы программа находила нужный непрерывный непустой фрагмент в строке blank и выводила результат на экран.
Фрагмент считается подходящим, если выполнены условия:
- каждая из трёх именных рун из
runesвстречается в нём ровно один раз (с учётом регистра символов); - любые посторонние знаки могут присутствовать в любом количестве.
Среди всех подходящих фрагментов выберите тот, у которого длина минимальна. Если минимальную длину имеют несколько вариантов, выберите фрагмент с наименьшим начальным индексом.
Позиции символов в строке нумеруются с единицы. Выведите начальную позицию выбранного фрагмента и его длину через пробел. Если ни одного подходящего фрагмента в строке нет, выведите 0 0.
Ввод и вывод
Программа считывает данные из стандартного потока ввода stdin и выводит результат в стандартный поток вывода stdout.
Формат ввода
- Первая строка содержит ровно три различные буквы ASCII (
A-Zилиa-z) без пробелов. - Вторая строка содержит заготовку длиной от 0 до 80 печатных символов ASCII (коды 32–126). Пробелы, включая начальные и завершающие, считаются знаками заготовки и учитываются в длине.
Формат вывода
Одна строка с двумя целыми числами через пробел: начальная позиция (начиная с 1) и длина найденного фрагмента, либо 0 0, если подходящего фрагмента не существует.
Пример
- Ввод
ABC xA?B#Cz
- Вывод
2 5
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Удаление ключа из ChainMap в Python: проверка поведения del
- Обратный индекс на Python: группировка уникальных значений через defaultdict
- Подсчёт дефицита ресурсов в Python: квоты и суммы заявок
- ChainMap в Python: исправьте приоритет настроек и удаление переопределений
- Иерархия конфигурации в Python: изоляция настроек разных клиентов
- Объединение команд и подсчёт рейтинга на Python
