Кольцевой буфер 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
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи