В одно время для кодирования
информации использовалась довольно упрощенно схема - вращение и перезаписывание
символов в алфавите. Одним из таких вариантов была схема ROT13, в которой
символы A-Z поворачивались на 13 позиций, причем это была широко используемая
небезопасная схема, которая пыталась "скрыть" данные во многих
приложениях с конца 1990-х и до начала 2000-х годов.
Задачей Insecure Inc. было
создать алгоритм, который бы "улучшил" представленную схему сначала
обращением, а затем вращением. Например, применим алгоритм к строке ABCD с
обращением и вращением на 1: после обращения получим DCBA, а после вращения на
1 позицию получим EDCB.
Вам следует реализовать указанную
схему кодирования для строк, содержащих только заглавные буквы, символы нижнего
подчеркивания и точки. Вращения следует производить согласно следующего
алфавитного порядка:
ABCDEFGHIJKLMNOPQRSTUVWXYZ_.
Символ нижнего подчеркивания
следует за Z, точка следует за нижним подчеркиванием. Вращение вперед на 1
означает что 'A' будет заменено на 'B', то есть 'A' → 'B', 'B' →
'C', ..., 'Z' → ' _ ', ' _ ' → '.' и '.' → 'A'. Точно также
поворот на 3 означает 'A' → 'D', 'B' → 'E', ..., '.' → 'C'.
Вход. Каждая
строка содержит целое число n и
строку символов. Число n (1 ≤ n ≤ 27) обозначает количество
позиций, на которое происходит вращение вперед. Строка представляет собой
сообщение, которое следует закодировать, оно содержит от 1 до 40 символов,
среди которых буквы верхнего регистра, нижние подчеркивания и точки. Последняя
строка содержит 0 и означает конец входных данных.
Выход. Для каждого теста вывести в
отдельной строке "закодированное" сообщение после выполнения вращения
и сдвига.
Пример входа
1 ABCD
3 YO_THERE.
1 .DOT
14 ROAD
9 SHIFTING_AND_ROTATING_IS_NOT_ENCRYPTING
2 STRING_TO_BE_CONVERTED
1 SNQZDRQDUDQ
0
Пример выхода
EDCB
CHUHKWBR.
UPEA
ROAD
PWRAYF_LWNHAXWH.RHPWRAJAX_HMWJHPWRAORQ.
FGVTGXPQEAGDAQVAIPKTVU
REVERSE_ROT
строки
Анализ алгоритма
В задаче следует произвести
указанное моделирование.
Реализация алгоритма
Объявим
вспомогательные строки.
char s[100];
char alpha[29] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_.";
Читаем
входные данные. Вычисляем длину строки len.
while(scanf("%d
%s",&n,s),n)
{
len = strlen(s);
Обращаем
строку.
reverse(s,s+len);
Совершаем
циклический сдвиг.
for(i = 0; i
< len; i++)
{
if (s[i] ==
'.') s[i] = 27; else
if (s[i] ==
'_') s[i] = 26;
else s[i]
-= 'A';
s[i] = (s[i] + n) % 28;
if (s[i] ==
27) s[i] = '.'; else
if (s[i] ==
26) s[i] = '_';
else s[i]
+= 'A';
}
Выводим
"закодированное" сообщение после выполнения вращения и сдвига.
puts(s);
}