#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <string>
using namespace std;
// Tu bedziemy trzymali tablice mozliwch szyfrowan dla liter od A do Z.
// Poczatkowy element kazdej z takich tablic to dlugosc reszty tej tablicy.
// Zakladamy ponadto, ze nie bedziemy mieli wiecej niz 5 mozliwych szyfrowan danej litery.
// Rezerwujemy 0 na znaki inne niz A-Z, ktore w deszyfracji zamienimy na spacje.
unsigned szyfr[26][6] =
{{2, 1, 2},
{2, 3, 4},
{4, 5, 6, 7, 8},
{3, 9, 10, 11},
{2, 12, 13},
{2, 14, 15},
{2, 16, 17},
{2, 18, 19},
{2, 20, 21},
{2, 22, 23},
{2, 24, 25},
{2, 26, 27},
{2, 28, 29},
{2, 30, 31},
{2, 32, 33},
{2, 34, 35},
{2, 36, 37},
{2, 38, 39},
{2, 40, 41},
{2, 42, 43},
{2, 44, 45},
{2, 46, 47},
{2, 48, 49},
{2, 50, 51},
{2, 52, 53},
{2, 54, 55}
};
unsigned wybierz_losowy_element(unsigned *mozliwe_szyfrowania) {
unsigned dlugosc = mozliwe_szyfrowania[0];
return mozliwe_szyfrowania[rand() * dlugosc + 1]; // +1 bo pierwszy element tablicy okresla liczbe pozostalych,
// wiec nie jest brany pod uwage w losowaniu
}
unsigned szyfruj(char x) {
return wybierz_losowy_element(szyfr[x - 'A']);
}
void szyfruj(string s, unsigned* wyjscie) {
for(int i = 0; i < s.length(); ++i){
if(s[i] >= 'A' && s[i] <= 'Z') wyjscie[i] = szyfruj(s[i]); else s[i] = 0;
}
}
char odszyfruj(unsigned x) {
if(x == 0) return ' ';
for(int i = 0; i < 26; ++i){
for(int j = 1; j < szyfr[i][0]; ++j){
if(x == szyfr[i][j]) return j + 'A';
}
}
}
string odszyfruj(unsigned *zaszyfrowany, unsigned dlugosc){
string s;
for(int i = 0; i < dlugosc; ++i){
s.push_back(odszyfruj(zaszyfrowany[i]));
}
return s;
}
void wypisz(unsigned *zaszyfrowany, unsigned dlugosc){
cout << "Zaszyfrowany tekst to\n";
for(int i = 0; i < dlugosc; ++i) cout << zaszyfrowany[i] << " ";
cout << endl;
}
int main() {
srand(time(NULL));
cout << "Wprowadz tekst do zaszyfrowania (inne znaki niz wielkie litery beda w deszyfracj zamienione na spacje)";
string jawny;
getline(cin, jawny);
unsigned dlugosc = jawny.length();
unsigned *wyjscie = new unsigned[dlugosc];
szyfruj(jawny, wyjscie);
wypisz(wyjscie, dlugosc);
string odszyfrowany = odszyfruj(wyjscie, dlugosc);
cout << "Po odszyfrowaniu\n" << odszyfrowany;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDxzdHJpbmc+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBUdSBiZWR6aWVteSB0cnp5bWFsaSB0YWJsaWNlIG1vemxpd2NoIHN6eWZyb3dhbiBkbGEgbGl0ZXIgb2QgQSBkbyBaLgovLyBQb2N6YXRrb3d5IGVsZW1lbnQga2F6ZGVqIHogdGFraWNoIHRhYmxpYyB0byBkbHVnb3NjIHJlc3p0eSB0ZWogdGFibGljeS4KLy8gWmFrbGFkYW15IHBvbmFkdG8sIHplIG5pZSBiZWR6aWVteSBtaWVsaSB3aWVjZWogbml6IDUgbW96bGl3eWNoIHN6eWZyb3dhbiBkYW5laiBsaXRlcnkuCi8vIFJlemVyd3VqZW15IDAgbmEgem5ha2kgaW5uZSBuaXogQS1aLCBrdG9yZSB3IGRlc3p5ZnJhY2ppIHphbWllbmlteSBuYSBzcGFjamUuCnVuc2lnbmVkIHN6eWZyWzI2XVs2XSA9CiAgICB7ezIsIDEsIDJ9LAogICAgIHsyLCAzLCA0fSwKICAgICB7NCwgNSwgNiwgNywgOH0sCiAgICAgezMsIDksIDEwLCAxMX0sCiAgICAgezIsIDEyLCAxM30sCiAgICAgezIsIDE0LCAxNX0sCiAgICAgezIsIDE2LCAxN30sCiAgICAgezIsIDE4LCAxOX0sCiAgICAgezIsIDIwLCAyMX0sCiAgICAgezIsIDIyLCAyM30sCiAgICAgezIsIDI0LCAyNX0sCiAgICAgezIsIDI2LCAyN30sCiAgICAgezIsIDI4LCAyOX0sCiAgICAgezIsIDMwLCAzMX0sCiAgICAgezIsIDMyLCAzM30sCiAgICAgezIsIDM0LCAzNX0sCiAgICAgezIsIDM2LCAzN30sCiAgICAgezIsIDM4LCAzOX0sCiAgICAgezIsIDQwLCA0MX0sCiAgICAgezIsIDQyLCA0M30sCiAgICAgezIsIDQ0LCA0NX0sCiAgICAgezIsIDQ2LCA0N30sCiAgICAgezIsIDQ4LCA0OX0sCiAgICAgezIsIDUwLCA1MX0sCiAgICAgezIsIDUyLCA1M30sCiAgICAgezIsIDU0LCA1NX0KfTsKCnVuc2lnbmVkIHd5YmllcnpfbG9zb3d5X2VsZW1lbnQodW5zaWduZWQgKm1vemxpd2Vfc3p5ZnJvd2FuaWEpIHsKICAgIHVuc2lnbmVkIGRsdWdvc2MgPSBtb3psaXdlX3N6eWZyb3dhbmlhWzBdOwogICAgcmV0dXJuIG1vemxpd2Vfc3p5ZnJvd2FuaWFbcmFuZCgpICogZGx1Z29zYyArIDFdOyAvLyArMSBibyBwaWVyd3N6eSBlbGVtZW50IHRhYmxpY3kgb2tyZXNsYSBsaWN6YmUgcG96b3N0YWx5Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpZWMgbmllIGplc3QgYnJhbnkgcG9kIHV3YWdlIHcgbG9zb3dhbml1Cn0KCnVuc2lnbmVkIHN6eWZydWooY2hhciB4KSB7CiAgICByZXR1cm4gd3liaWVyel9sb3Nvd3lfZWxlbWVudChzenlmclt4IC0gJ0EnXSk7Cn0KCnZvaWQgc3p5ZnJ1aihzdHJpbmcgcywgdW5zaWduZWQqIHd5anNjaWUpIHsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyArK2kpewogICAgICAgIGlmKHNbaV0gPj0gJ0EnICYmIHNbaV0gPD0gJ1onKSB3eWpzY2llW2ldID0gc3p5ZnJ1aihzW2ldKTsgZWxzZSBzW2ldID0gMDsKICAgIH0KfQoKY2hhciBvZHN6eWZydWoodW5zaWduZWQgeCkgewogICAgaWYoeCA9PSAwKSByZXR1cm4gJyAnOwogICAgZm9yKGludCBpID0gMDsgaSA8IDI2OyArK2kpewogICAgICAgIGZvcihpbnQgaiA9IDE7IGogPCBzenlmcltpXVswXTsgKytqKXsKICAgICAgICAgICAgaWYoeCA9PSBzenlmcltpXVtqXSkgcmV0dXJuIGogKyAnQSc7CiAgICAgICAgfQogICAgfQp9CgpzdHJpbmcgb2RzenlmcnVqKHVuc2lnbmVkICp6YXN6eWZyb3dhbnksIHVuc2lnbmVkIGRsdWdvc2MpewogICAgc3RyaW5nIHM7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgZGx1Z29zYzsgKytpKXsKICAgICAgICBzLnB1c2hfYmFjayhvZHN6eWZydWooemFzenlmcm93YW55W2ldKSk7CiAgICB9CiAgICByZXR1cm4gczsKfQoKdm9pZCB3eXBpc3oodW5zaWduZWQgKnphc3p5ZnJvd2FueSwgdW5zaWduZWQgZGx1Z29zYyl7CiAgICBjb3V0IDw8ICJaYXN6eWZyb3dhbnkgdGVrc3QgdG9cbiI7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgZGx1Z29zYzsgKytpKSBjb3V0IDw8IHphc3p5ZnJvd2FueVtpXSA8PCAiICI7CiAgICBjb3V0IDw8IGVuZGw7Cn0KCmludCBtYWluKCkgewogICAgc3JhbmQodGltZShOVUxMKSk7CiAgICBjb3V0IDw8ICJXcHJvd2FkeiB0ZWtzdCBkbyB6YXN6eWZyb3dhbmlhIChpbm5lIHpuYWtpIG5peiB3aWVsa2llIGxpdGVyeSBiZWRhIHcgZGVzenlmcmFjaiB6YW1pZW5pb25lIG5hIHNwYWNqZSkiOwogICAgc3RyaW5nIGphd255OwogICAgZ2V0bGluZShjaW4sIGphd255KTsKICAgIHVuc2lnbmVkIGRsdWdvc2MgPSBqYXdueS5sZW5ndGgoKTsKICAgIHVuc2lnbmVkICp3eWpzY2llID0gbmV3IHVuc2lnbmVkW2RsdWdvc2NdOwogICAgc3p5ZnJ1aihqYXdueSwgd3lqc2NpZSk7CiAgICB3eXBpc3ood3lqc2NpZSwgZGx1Z29zYyk7CiAgICBzdHJpbmcgb2Rzenlmcm93YW55ID0gb2RzenlmcnVqKHd5anNjaWUsIGRsdWdvc2MpOwogICAgY291dCA8PCAiUG8gb2Rzenlmcm93YW5pdVxuIiA8PCBvZHN6eWZyb3dhbnk7Cn0=