Задача 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 |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <iostream> #include <cstring> using namespace std; //функция, которая определяет номер введённого символа в данном массиве int find(const char* str, char c) { for(int i = 0; str[i] != '\0'; i++) { if(str[i] == c) { return i; } } return -1;//если в введённой строке есть пробелы } int main() { int n = 27, k = 1024; const char *a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char b[k]; char c[n]; cin.getline(b, k); cin.getline(c, n); for(int i = 0; b[i] != '\0'; i++) { int index = find(a, b[i]); if(index != -1) { cout << c[index]; } else { cout << b[i]; } } return 0; } |
Для запроса на выполнение нажать здесь.
Ссылка на засчитанное решение.
Код программы с использованнием класса «string»
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <iostream> #include <string> using namespace std; int main() { string b, c; getline(cin, b); getline(cin, c); for(int i = 0; i < b.length(); i++) { cout << (b[i] - 'A' < 0? ' ': c[b[i] - 'A']); } return 0; } |
Для запроса на выполнение нажать здесь.
Ссылка на засчитанное решение.
Решение
Чтоб расшифровать послание, нужно определить порядковый номер каждого символа, из введённого сообщения, в алфавите. Потом заменить их символом соответствующего порядкового номера из второй введённой строки.
Хорошо получилось. Молодец.
Кстати, в условии задачи автор ошибся. Это не перестановочный шифр, а ШПЗ (Шифр Простой Замены). В перестановочных шифрах буквы переставляются на другое место в тексте, а не заменяются на другие.
По второму коду. Эта строка (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']);
Спасибо, Игорь Евгеньевич, я исправила.
Хорошо. Зачтено.