Специализированные структуры данных и потоковая обработка

Коллекции стандартной библиотеки: deque, Counter, defaultdict и ChainMap

Содержание курса

0 / 1 баллов

Карусельный шифратор

Необычный прибор преобразует текст с помощью кольцевого барабана, на котором по кругу нанесены символы алфавита. Над барабаном закреплен неподвижный указатель, и его начальное положение известно. Механизм принимает исходную запись и читает её знак за знаком.

Если текущий символ есть на барабане, устройство отсчитывает смещение от указателя до нужной ячейки в заданном направлении по кругу. Зафиксировав это значение, прибор поворачивает барабан так, чтобы найденный символ встал точно под указатель, и следующий шаг начинает уже от него. Если же символа на кольце нет, барабан остаётся на месте, а механизм выдаёт условный знак пропуска.

Изобретателю нужно заранее узнать, какую цепочку смещений и знаков пропуска выдаст устройство для всей подготовленной фразы.

Что уже дано

Скрипт импортирует deque из модуля collections и считывает две строки через вызовы input():

  • alphabet — символы на кольцевом барабане;
  • message — обрабатываемое сообщение.

Никаких других скрытых переменных или файлов нет. Вам предстоит заменить заглушку с ошибкой NotImplementedError собственным кодом.

Что нужно сделать

Обработайте символы строки message строго по порядку и выведите полученные значения в виде одной строки.

Правила работы устройства:

  • Символы алфавита расположены на барабане по кругу в том порядке, в котором они переданы в первой строке. Изначально под указателем находится самый первый символ переданного алфавита.
  • Направление отсчёта — вперёд по порядку символов алфавита (после последнего символа снова следует первый).
  • Если текущий символ сообщения есть на барабане, вычислите количество шагов от текущего указателя до этого символа (целое неотрицательное число от 0 до длины алфавита минус один). Если символ уже находится под указателем, смещение равно 0. После фиксации смещения барабан поворачивается так, что этот символ оказывается под указателем для обработки последующих знаков.
  • Если символа сообщения нет на барабане, выдаётся знак пропуска ?, а барабан и указатель остаются в прежнем положении.

Ввод и вывод

Программа взаимодействует с пользователем через стандартные потоки stdin и stdout.

Формат ввода

  • Первая строка содержит строку алфавита (от 1 до 52 различных ASCII-букв верхнего и нижнего регистров).
  • Вторая строка содержит исходное сообщение (от 0 до 1000 печатных ASCII-символов, включая пробелы). Символ перевода строки не входит в само сообщение.

Формат вывода

Выведите одну строку, в которой через пробел записаны токены для каждого символа исходного сообщения в порядке его обхода: неотрицательные десятичные числа смещений или знак ?. Если исходное сообщение пустое, выведите пустую строку.

О данных в ответах

Используйте учебные данные. Не вставляйте пароли, токены, ключи доступа, паспортные и банковские данные, а также персональные данные других людей. Политика обработки данных.

Проверяется тестами (1)
  • Тест 1
    Ввод
    ABCD
    CA?AD
    
    Ожидаемый вывод
    2 2 ? 0 3
    
Решение
Как проверяется решение

Сравнение вывода: Правила исходной проверяющей системы. Интерактивный запуск не влияет на оценку. Лимит сессии — 5 минут, процессорного времени — 10 секунд.

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

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения и доступны преподавателям курса. Чтобы попросить преподавателя подключиться, отправьте обращение из диалога.

Проверка решения остаётся отдельным действием.