e-olymp 378. Таинственная записка

Задача e-olymp 378.

Условие

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

Закодированное сообщение: HPC PJVYMIY

Декодированное сообщение: ACM CONTEST

В этом примере выполнены следующие замены: H=A, P=C, C=M, J=O, V=N, Y=T, M=E и I=S.

Чтобы не заниматься кодированием и декодированием вручную, подруги просят Вас написать программу. Помогите девочкам!

Входные данные

В первой строке входного файла записано закодированное сообщение. Вторая строка — 26 латинских букв верхнего регистра, представляющих собой код для соответствующего символа алфавита: первый символ дает код для A, второй для B и так далее. Используются только буквы верхнего регистра. В закодированном сообщении могут появиться пробелы, которые должны быть сохранены в выходной строке.

Выходные данные

В выходной файл вывести одну строку, в которой содержится расшифрованное сообщение.

Тесты

Входные данные Выходные данные
HPC PJVYMIY

BLMRGJIASOPZEFDCKWYHUNXQTV

ACM CONTEST
FDY GAI BG UKMY
KIMHOTSQYRLCUZPAGWJNBVDXEF
THE SKY IS BLUE
LJBSLJL IJWWDEJ
KCFAGWRZMEXDNUYHVBOIJLSTPQ
DECODED MESSAGE

Код программы

Для запроса на выполнение нажать здесь.

Ссылка на засчитанное решение.

Код программы с использованнием класса «string»

Для запроса на выполнение нажать здесь.

Ссылка на засчитанное решение.

Решение

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

4 thoughts on “e-olymp 378. Таинственная записка

  1. Хорошо получилось. Молодец.
    Кстати, в условии задачи автор ошибся. Это не перестановочный шифр, а ШПЗ (Шифр Простой Замены). В перестановочных шифрах буквы переставляются на другое место в тексте, а не заменяются на другие.

  2. По второму коду. Эта строка (a.find_first_of(b[i]) == string::npos)? cout << " " : cout << c[a.find_first_of(b[i])]; содержит методическую ошибку. Так использовать тернарную операцию нельзя. Схема должна быть такой cout <<  (... ? ... : ...);

    Теперь по обоим кодам. Я немного схитрил и не рассказал Вам, что поиск символа в строке здесь не нужен. Мне просто понравилось, что Вы написали такую функцию. Это хорошая практика.
    Узнать место буквы в алфавите можно без поиска. Все буквы имеют целочисленные коды и коды эти идут подряд. Значит если от кода буквы отнять код буквы A, то и получите искомое.
    Т.е. должно быть что-то вроде cout << (b[i] - 'A' < 0? ' ': c[b[i] - 'A']);

Добавить комментарий