Редакция для Расшифрование шифра Атбаш
Submitting an official solution before solving the problem yourself is a bannable offence.
1. Идея
Нужно расшифровать строку, записанную шифром Атбаш.
Суть шифра очень проста: каждая заглавная латинская буква заменяется на "зеркальную" букву алфавита:
A↔ZB↔YC↔X- ...
M↔N
Так как шифр симметричен, для расшифровки выполняется та же самая операция, что и для шифрования.
Значит, достаточно пройти по всем символам строки:
- если символ — заглавная латинская буква, заменить его на симметричную;
- иначе оставить как есть.
2. Наблюдения
Наблюдение 1
В условии сказано, что изменять нужно только заглавные латинские буквы от A до Z.
Пробелы и любые другие символы должны остаться без изменений.
Наблюдение 2
Можно не хранить отдельную таблицу соответствий.
Для буквы c симметричная буква вычисляется по формуле:
'A' + 'Z' - c
Почему это работает:
- у
AиZсумма кодов одна и та же; - у
BиYтоже; - у
CиXтоже; - значит, если известна одна буква пары, вторую можно найти как
A + Z - c.
Примеры:
- для
A:'A' + 'Z' - 'A' = 'Z' - для
B:'A' + 'Z' - 'B' = 'Y' - для
Z:'A' + 'Z' - 'Z' = 'A'
Наблюдение 3
Задача решается за один проход по строке, потому что каждый символ обрабатывается независимо от остальных.
3. Алгоритм
- Считать всю строку целиком.
- Создать пустой результат.
- Для каждого символа
cв строке:- если
cнаходится в диапазоне отAдоZ, добавить в результат символ'A' + 'Z' - c; - иначе добавить сам
c.
- если
- Вывести полученную строку.
4. Почему это работает
Докажем корректность алгоритма.
Рассмотрим любой символ входной строки.
- Если это не заглавная латинская буква, по условию его нужно оставить без изменений. Алгоритм именно так и делает.
- Если это заглавная латинская буква, шифр Атбаш требует заменить её на симметричную букву алфавита. Формула
'A' + 'Z' - cкак раз возвращает такую букву:Aпереходит вZ,BвY,- ...
ZвA.
Так как каждый символ обрабатывается правильно, вся строка после обработки тоже будет расшифрована правильно.
Следовательно, алгоритм верно решает задачу.
5. Сложность
Пусть длина строки равна n.
- Время работы:
O(n), потому что каждый символ обрабатывается один раз. - Дополнительная память:
O(n), потому что формируется строка результата.
6. Код на C++17
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
getline(cin, s);
string result;
for (char c : s) {
if (c >= 'A' && c <= 'Z') {
result += char('A' + 'Z' - c);
} else {
result += c;
}
}
cout << result << '\n';
return 0;
}
7. Код на Python 3
s = input()
result = []
for c in s:
if 'A' <= c <= 'Z':
result.append(chr(ord('A') + ord('Z') - ord(c)))
else:
result.append(c)
print(''.join(result))
Комментарии