Кольцевой буфер Python: поворот алфавита и шифрование строки
Напишите решение на Python и проверьте его на странице.
Другие упражнения по этой теме: Collections в Python: задачи на ChainMap, defaultdict и deque.
Карусельный шифратор
Необычный прибор преобразует текст с помощью кольцевого барабана, на котором по кругу нанесены символы алфавита. Над барабаном закреплен неподвижный указатель, и его начальное положение известно. Механизм принимает исходную запись и читает её знак за знаком.
Если текущий символ есть на барабане, устройство отсчитывает смещение от указателя до нужной ячейки в заданном направлении по кругу. Зафиксировав это значение, прибор поворачивает барабан так, чтобы найденный символ встал точно под указатель, и следующий шаг начинает уже от него. Если же символа на кольце нет, барабан остаётся на месте, а механизм выдаёт условный знак пропуска.
Изобретателю нужно заранее узнать, какую цепочку смещений и знаков пропуска выдаст устройство для всей подготовленной фразы.
Что уже дано
Скрипт импортирует deque из модуля collections и считывает две строки через вызовы input():
alphabet— символы на кольцевом барабане;message— обрабатываемое сообщение.
Никаких других скрытых переменных или файлов нет. Вам предстоит заменить заглушку с ошибкой NotImplementedError собственным кодом.
Что нужно сделать
Обработайте символы строки message строго по порядку и выведите полученные значения в виде одной строки.
Правила работы устройства:
- Символы алфавита расположены на барабане по кругу в том порядке, в котором они переданы в первой строке. Изначально под указателем находится самый первый символ переданного алфавита.
- Направление отсчёта — вперёд по порядку символов алфавита (после последнего символа снова следует первый).
- Если текущий символ сообщения есть на барабане, вычислите количество шагов от текущего указателя до этого символа (целое неотрицательное число от
0до длины алфавита минус один). Если символ уже находится под указателем, смещение равно0. После фиксации смещения барабан поворачивается так, что этот символ оказывается под указателем для обработки последующих знаков. - Если символа сообщения нет на барабане, выдаётся знак пропуска
?, а барабан и указатель остаются в прежнем положении.
Ввод и вывод
Программа взаимодействует с пользователем через стандартные потоки stdin и stdout.
Формат ввода
- Первая строка содержит строку алфавита (от 1 до 52 различных ASCII-букв верхнего и нижнего регистров).
- Вторая строка содержит исходное сообщение (от 0 до 1000 печатных ASCII-символов, включая пробелы). Символ перевода строки не входит в само сообщение.
Формат вывода
Выведите одну строку, в которой через пробел записаны токены для каждого символа исходного сообщения в порядке его обхода: неотрицательные десятичные числа смещений или знак ?. Если исходное сообщение пустое, выведите пустую строку.
Пример
- Ввод
ABCD CA?AD
- Вывод
2 2 ? 0 3
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Удаление ключа из ChainMap в Python: проверка поведения del
- Обратный индекс на Python: группировка уникальных значений через defaultdict
- Подсчёт дефицита ресурсов в Python: квоты и суммы заявок
- ChainMap в Python: исправьте приоритет настроек и удаление переопределений
- Иерархия конфигурации в Python: изоляция настроек разных клиентов
- Скользящее окно Python: найдите кратчайшую подстроку с тремя символами
