7735. Вращение обращения

 

В одно время для кодирования информации использовалась довольно упрощенно схема - вращение и перезаписывание символов в алфавите. Одним из таких вариантов была схема 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);

}