Advertisement
madras

Untitled

Jan 19th, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.60 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3. #include <string>
  4. #include <set>
  5. #include <ctime>
  6. #include <vector>
  7. #include <fstream>
  8.  
  9. #define MAX_LEGTH 10
  10.  
  11. using namespace std;
  12.  
  13. set<string> brute_words;
  14. set<string> optimal_words;
  15.  
  16. size_t bruteforce(char* input);
  17. size_t optimal(char* input);
  18.  
  19. int main() {
  20.   srand(time(nullptr));
  21.  
  22.   size_t counter = 0;
  23.   size_t bad_counter = 0;
  24.   char name_buffer[32];
  25.   char* word = (char*)malloc(MAX_LEGTH + 1);
  26.  
  27.   char new_char[2];
  28.   new_char[1] = '\0';
  29.  
  30.   while(bad_counter < 1) {
  31.     word[0] = '\0';
  32.  
  33.     int length = 3 + rand() % (MAX_LEGTH - 2);
  34.     for(int i = 0; i < length; ++i) {
  35.       new_char[0] = 'a' + rand() % 26;
  36.       strcat(word, new_char);
  37.     }
  38.  
  39.     size_t brute_result = bruteforce(word);
  40.     size_t optimal_result = optimal(word);
  41.  
  42.     if(brute_words == optimal_words) {
  43.       cout << "Test: " << counter << '\t' << brute_words.size() << " == " << optimal_words.size() << endl;
  44.     } else {
  45.       cout << "Test: " << counter << '\t' << brute_words.size() << " != " << optimal_words.size() << endl;
  46.       sprintf(name_buffer, "%zu.txt", counter);
  47.       fstream file(name_buffer, ios::out);
  48.       file << word;
  49.       file.close();
  50.       bad_counter++;
  51.  
  52.       auto brute_it = brute_words.cbegin();
  53.       auto optimal_it = optimal_words.cbegin();
  54.  
  55.       while(brute_it != brute_words.cend()) {
  56.         cout << *brute_it << endl;
  57.         cout << *optimal_it << endl;
  58.  
  59.         ++brute_it;
  60.         ++optimal_it;
  61.       }
  62.     }
  63.  
  64.     counter++;
  65.   }
  66.  
  67.   free(word);
  68.   return 0;
  69. }
  70.  
  71. size_t bruteforce(char* input) {
  72.   size_t input_size = strlen(input);
  73.  
  74.   brute_words.clear();
  75.  
  76.   // zmienne do tymczasowego przechowania usuwanych znaków
  77.   char i_char;
  78.   char k_char;
  79.  
  80.   for(size_t i = 0; i < input_size-1; ++i) {
  81.     i_char = input[i];
  82.     input[i] = '\0';
  83.  
  84.     for(size_t k = i + 1; k < input_size; ++k) {
  85.       k_char = input[k];
  86.       input[k] = '\0';
  87.  
  88.       // allokacja pamięci na kopię pozbawioną usuwanych znaków
  89.       char* copy = (char*)malloc(input_size);
  90.       snprintf(copy, input_size, "%s%s%s", input, &input[i+1], &input[k+1]);
  91.       brute_words.insert(copy);
  92.       free(copy);
  93.  
  94.       input[k] = k_char;
  95.     }
  96.  
  97.     input[i] = i_char;
  98.   }
  99.  
  100.   return brute_words.size();
  101. }
  102.  
  103. size_t optimal(char* input) {
  104.   size_t input_size = strlen(input);
  105.   size_t sum = 0;
  106.   char before_window = '\0'; // znak przed pierwszym usuwanym znakiem
  107.   char overwrite_char; // tymczasowe przechowanie pierwszego z usuwanych znaków
  108.  
  109.   optimal_words.clear();
  110.  
  111.   for(size_t i = 1; i < input_size; ++i) {
  112.     if (before_window != input[i]) {
  113.       ++sum;
  114.       overwrite_char = input[i-1];
  115.       input[i-1] = '\0';
  116.  
  117.       char* copy = (char*)malloc(input_size);
  118.       snprintf(copy, input_size, "%s%s\n", input, &input[i+1]);
  119.       optimal_words.insert(copy);
  120.       free(copy);
  121.  
  122.       input[i-1] = overwrite_char;
  123.     }
  124.  
  125.     before_window = input[i-1];
  126.   }
  127.  
  128.   // zmienne do tymczasowego przechowania usuwanych znaków
  129.   char i_char;
  130.   char k_char;
  131.  
  132.   for(size_t i = 2; i < input_size; ++i) {
  133.     if(input[i] == input[i-1])
  134.       continue;
  135.  
  136.     i_char = input[i];
  137.     input[i] = '\0';
  138.  
  139.     for(size_t k = 0; k < i-1; ++k) {
  140.       if(input[k] != input[k+1]) {
  141.         ++sum;
  142.         k_char = input[k];
  143.         input[k] = '\0';
  144.  
  145.         char* copy = (char*)malloc(input_size);
  146.         snprintf(copy, input_size, "%s%s%s\n", input, &input[k+1], &input[i+1]);
  147.         optimal_words.insert(copy);
  148.         free(copy);
  149.  
  150.         input[k] = k_char;
  151.       }
  152.     }
  153.     input[i] = i_char;
  154.   }
  155.  
  156.   return sum;
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement