Редакция для Расшифрование шифра Атбаш


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

1. Идея

Нужно расшифровать строку, записанную шифром Атбаш.

Суть шифра очень проста: каждая заглавная латинская буква заменяется на "зеркальную" букву алфавита:

  • AZ
  • BY
  • CX
  • ...
  • MN

Так как шифр симметричен, для расшифровки выполняется та же самая операция, что и для шифрования.

Значит, достаточно пройти по всем символам строки:

  • если символ — заглавная латинская буква, заменить его на симметричную;
  • иначе оставить как есть.

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. Алгоритм

  1. Считать всю строку целиком.
  2. Создать пустой результат.
  3. Для каждого символа c в строке:
    • если c находится в диапазоне от A до Z, добавить в результат символ 'A' + 'Z' - c;
    • иначе добавить сам c.
  4. Вывести полученную строку.

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))

Комментарии

Еще нет ни одного комментария.