Advertisement
ZergRushA

problem code

Jul 27th, 2023
950
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.95 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string>
  4. #include <map>
  5. #include <random>
  6. using namespace std;
  7.  
  8. std::random_device dev;
  9. std::mt19937 rng(dev());
  10. const std::string nulls = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  11. std::uniform_int_distribution<std::mt19937::result_type> dist_nulls(0, nulls.length()-1);
  12.  
  13. std::string key = "ZEBRAS";
  14. std::map<int, int> key_order;
  15.  
  16.     void set_permutation_order(){
  17.         for(int i = 0; i < key.length(); ++i)
  18.             key_order[key[i]] = i;
  19.     }
  20.  
  21.     void normalize(std::string& str){
  22.         str.erase(std::remove_if(str.begin(), str.end(), ::isspace), str.end());
  23.         std::transform(str.begin(), str.end(), str.begin(), ::toupper);
  24.     }
  25.  
  26.     std::string columnar_transpos_encrypt(std::string msg){
  27.        
  28.         normalize(msg);
  29.         //std::cout << msg << '\n';
  30.         int cols = key.length();
  31.         int rows = msg.length()/cols;
  32.  
  33.         if(msg.length() % cols)
  34.             ++rows;
  35.        
  36.  
  37.         char** matrix = new char*[rows];
  38.         for(int i = 0; i < rows; ++i)
  39.             matrix[i] = new char[cols];
  40.        
  41.  
  42.         int ind{0};
  43.         for(int row = 0; row < rows; ++row){
  44.             for(int col = 0; col < cols; ++col){
  45.                 if(ind >= msg.length())
  46.                     matrix[row][col] = nulls[dist_nulls(rng)];
  47.                 else
  48.                     matrix[row][col] = msg[ind++];
  49.             }
  50.         }
  51.        
  52.         //std::cout << rows << " " << cols << '\n';
  53.         std::string encrypted{};
  54.         int col_order{};
  55.         for(auto it = key_order.begin(); it != key_order.end(); ++it){
  56.             col_order = it->second;
  57.             for(int row = 0; row < rows; ++row){
  58.                 encrypted += matrix[row][col_order];
  59.             }
  60.         }
  61.        
  62.         //for debug purpose
  63.        
  64.         for(int row = 0; row < rows; ++row){
  65.             for(int col = 0; col < cols; ++col){
  66.                 std::cout << matrix[row][col] << ' ';
  67.             }
  68.             std::cout << '\n';
  69.         }
  70.        
  71.        
  72.         for(int i = 0; i < rows; ++i)
  73.             delete[] matrix[i];
  74.         delete[] matrix;
  75.  
  76.         return encrypted;
  77.  
  78.     }
  79.  
  80. std::string columnar_transpos_decrypt(std::string& ciphered){
  81.        
  82.         int cols = key.length();
  83.         int rows = ciphered.length()/cols;
  84.        
  85.         char** matrix = new char*[rows];
  86.         for(int i = 0; i < rows; ++i)
  87.             matrix[i] = new char[cols];
  88.        
  89.         std::cout << cols << " cols " << rows << " rows\n";
  90.        
  91.         std::string sorted_key = key;
  92.         std::sort(sorted_key.begin(), sorted_key.end());
  93.         //тут начинаются странности
  94.         int ind{0};
  95.         for(const char& ch: sorted_key){
  96.             int col = key.find(ch);
  97.             for(int j = 0; j < rows; ++j){
  98.                 std::cout << ciphered[ind]; //для проверки того, действительно
  99.                                             //индекс идет по всей строке
  100.                 matrix[j][col] = ciphered[ind++];
  101.                
  102.             }
  103.         }
  104.        
  105.         std::cout << "\n";
  106.         //здесь видно, что матрица заполняется не полностью, хотя должна быть 6х5
  107.         for(int i = 0; i < cols; ++i){
  108.             for(int j = 0; j < rows; ++j){
  109.                 std::cout << matrix[i][j] << ' ';
  110.             }
  111.             std::cout << '\n';
  112.         }
  113.        
  114.        
  115.         /*
  116.         std::string sorted_key = key;
  117.         std::sort(sorted_key.begin(), sorted_key.end());
  118.        
  119.         int index{0};
  120.         for(const auto& ch: sorted_key){
  121.             //при заполнении проходит по sorted_key
  122.             //и находит индекс элемента sorted_key
  123.             //в строке key
  124.             int right_col = key.find(ch);
  125.             for(int row = 0; row < rows; ++row){
  126.                 matrix[row][right_col] = ciphered[++index];
  127.             }
  128.         }
  129.        
  130.         for(int col = 0; col < cols; ++col){
  131.             for(int row = 0; row < rows; ++row){
  132.                 std::cout << matrix[row][col] << " ";
  133.             }
  134.             std::cout << '\n';
  135.         }
  136.        
  137.         std::string deciphered{};
  138.         int str_len{0};
  139.         for(int row = 0; row < rows; ++row){
  140.             for(int col = 0; col < cols; ++col){
  141.                 deciphered += matrix[row][col];
  142.             }
  143.         }
  144.        
  145.         */
  146.         std::string deciphered{};
  147.         for(int i = 0; i < rows; ++i)
  148.             delete[] matrix[i];
  149.         delete[] matrix;
  150.        
  151.         return deciphered;
  152.     }
  153.  
  154. int main()
  155. {
  156.     std::string ms = "We are discovered flee at once";
  157.     set_permutation_order();
  158.     std::string res = columnar_transpos_encrypt(ms);
  159.     std::cout << "Ciphered: " << res << '\n';
  160.     std::cout << columnar_transpos_decrypt(res);
  161.     return 0;
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement