Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <string>
  4. #include <fstream>
  5. #include <iostream>
  6. #include <cmath>
  7. #include <chrono>
  8. #include <random>
  9. #include <cctype>
  10.  
  11. using Map = std::unordered_map<std::string, double>;
  12.  
  13. inline Map ReadNgrams(const std::string& filename) {
  14.     const int64_t TOTAL_SUM = 4224127912;
  15.  
  16.     std::ifstream ngramms_file(filename, std::ifstream::in);
  17.     Map res;
  18.  
  19.     std::string ngram;
  20.     double number;
  21.     while (ngramms_file >> ngram >> number) {
  22.         res[ngram] = std::log(number / static_cast<double>(TOTAL_SUM));
  23.     }
  24.     return res;
  25. }
  26.  
  27. inline double Evaluate(const std::vector<char>& perm, const std::string& text, const Map& dict) {
  28.     std::vector<char> cur_letters;
  29.     double cur_res = 0;
  30.     for (int letter_in_text = 0; letter_in_text < text.size(); ++letter_in_text) {
  31.         if (isalpha(text[letter_in_text])) {
  32.             cur_letters.push_back(text[letter_in_text]);
  33.         }
  34.         if (cur_letters.size() >= 4) {
  35.             std::string cur_ngramm = "    ";
  36.             for (size_t letter_in_ngramm = 0; letter_in_ngramm < 4; ++letter_in_ngramm) {
  37.                 char cur_letter = cur_letters[cur_letters.size() - 1 - 3 + letter_in_ngramm];
  38.                 cur_ngramm[letter_in_ngramm] = perm[toupper(cur_letter) - 'A'];
  39.             }
  40.             if (dict.find(cur_ngramm) != dict.end()) {
  41.                 cur_res += dict.at(cur_ngramm);
  42.             } else {
  43.                 cur_res += -50;
  44.             }
  45.         }
  46.     }
  47.     return cur_res;
  48. }
  49.  
  50. inline std::string Decode(const std::string& text, const Map& dict) {
  51.     int number = 0;
  52.     std::minstd_rand0 random_gen(1234122);
  53.     std::uniform_int_distribution<int> dist(0, 25);
  54.  
  55.     std::string cur_text = text;
  56.     std::vector<char> cur_perm;
  57.     for (char c = 0; c < 26; ++c) {
  58.         cur_perm.push_back('A' + c);
  59.     }
  60.     double cur_score = Evaluate(cur_perm, cur_text, dict);
  61.  
  62.     for (int time = 0; time < 10000; ++time) {
  63.         std::vector<char> tmp_perm = cur_perm;
  64.         int char1 = -1, char2 = -1;
  65.         while (char1 == char2) {
  66.             char1 = dist(random_gen);
  67.             char2 = dist(random_gen);
  68.         }
  69.         {
  70.             char old_char = tmp_perm[char1];
  71.             tmp_perm[char1] = tmp_perm[char2];
  72.             tmp_perm[char2] = old_char;
  73.         }
  74.  
  75.         double tmp_score = Evaluate(tmp_perm, cur_text, dict);
  76.         if (tmp_score > cur_score) {
  77.             cur_score = tmp_score;
  78.             cur_perm = tmp_perm;
  79.             number++;
  80.         }
  81.          std::cout << time + 1 << std::endl;
  82.     }
  83.     std::string decoded_text = text;
  84.     for (int i = 0; i < decoded_text.size(); ++i) {
  85.         if (isalpha(decoded_text[i])) {
  86.             if (isupper(decoded_text[i])) {
  87.                 decoded_text[i] = cur_perm[decoded_text[i] - 'A'];
  88.             } else {
  89.                 decoded_text[i] = tolower(cur_perm[toupper(decoded_text[i]) - 'A']);
  90.             }
  91.         }
  92.         // std::cout << decoded_text[i];
  93.     }
  94.     std::cout << number << "\n";
  95.     return decoded_text;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement