Paste Search Dynamic
Recent pastes
aZ Letter count
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define INVALID_INPUT 100
  6. #define INVALID_LENGTH 101
  7. #define OUT_OF_MEMORY 105
  8. #define SUCCESS 0
  9.  
  10. #define MEMORY_CHUNK 10
  11. #define LETTER_COUNT 52
  12.  
  13. const char aZ[LETTER_COUNT] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
  14.                                'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
  15.                                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
  16.                                'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
  17.  
  18. char* get_string();
  19. int compare(const char *str1, const char *str2);
  20. void shift(const char *src, char *dst, int offset);
  21. void copy_string(const char*, char*);
  22.  
  23. int main(){
  24.     char* encoded = get_string();
  25.     char* part_decoded = get_string();
  26.     int input_length = strlen(encoded);
  27.  
  28.     if(input_length != strlen(part_decoded)){
  29.         fprintf(stderr, "Error: Chybna delka vstupu!n");
  30.         free(encoded);
  31.         free(part_decoded);
  32.         return INVALID_LENGTH;
  33.     }
  34.     char* shifted = malloc(sizeof(char)*input_length);
  35.     char* decoded = malloc(sizeof(char)*input_length);
  36.  
  37.     int max_common = 0, common = 0;
  38.     for(int i = 0; i < LETTER_COUNT; i++){
  39.         shift(encoded, shifted, i);
  40.         common = compare(shifted, part_decoded);
  41.         if(common > max_common){
  42.             copy_string(shifted, decoded);
  43.             max_common = common;
  44.         }
  45.     }
  46.     printf("%sn", decoded);
  47.  
  48.     free(encoded);
  49.     free(part_decoded);
  50.     free(shifted);
  51.     free(decoded);
  52.  
  53.     return SUCCESS;
  54. }
  55.  
  56. char* get_string(){
  57.     char* input;
  58.     int used_space = 0;
  59.  
  60.     if((input = calloc(MEMORY_CHUNK, sizeof(char))) == null){
  61.         fprintf(stderr, "Error: Not enough memory!n");
  62.         free(input);
  63.         exit(OUT_OF_MEMORY);
  64.     }
  65.  
  66.     char in;
  67.     int scan_retval = scanf("%c", &in);
  68.  
  69.     while(in != 'n'){
  70.         if(scan_retval != 1 || strchr(aZ, in) == null){
  71.             fprintf(stderr, "Error: Chybny vstup!n");
  72.             free(input);
  73.             exit(INVALID_INPUT);
  74.         }
  75.  
  76.         if(used_space + 1 > MEMORY_CHUNK){
  77.             if((input = realloc(input, (used_space + MEMORY_CHUNK) * sizeof(char))) == null){
  78.                 fprintf(stderr, "Error: Not enough memory!n");
  79.                 free(input);
  80.                 exit(OUT_OF_MEMORY);
  81.             }
  82.         }
  83.  
  84.         input[used_space++] = in;
  85.         scan_retval = scanf("%c", &in);
  86.     }
  87.     input[used_space] = '';
  88.     return input;
  89. }
  90.  
  91. int compare(const char *str1, const char *str2){
  92.     int common = 0;
  93.     int length = strlen(str1);
  94.     for(int i = 0; i < length; i++){
  95.         if(str1[i] == str2[i]) common++;
  96.     }
  97.  
  98.     return common;
  99. }
  100.  
  101. void shift(const char *src, char *dst, int offset){
  102.     int length = strlen(src);
  103.     for(int i = 0; i < length; i++){
  104.         dst[i] = aZ[(strchr(aZ, src[i]) - aZ + offset) % LETTER_COUNT];
  105.     }
  106.     dst[length] = '';
  107. }
  108.  
  109. void copy_string(const char* src, char* dst){
  110.     int length = strlen(src);
  111.     for(int i = 0; i < length; i++){
  112.         dst[i] = src[i];
  113.     }
  114. }
  115.  
Parsed in 0.034 seconds