fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5.  
  6. // delka [a-z] nebo [A-Z]
  7. #define ENG 26
  8. // delka [a-zA-Z]
  9. #define LEN_AlPHA 52
  10. // zacatecni delka
  11. #define FIRST_LEN 10
  12. // funkce, ktera cte vstupni retezec
  13. char *read_line(int *line_length);
  14. //hledani delky posunu pri kodovani
  15. int search_shift(char*, char*);
  16. //desifrovani bez chyb
  17. int good_decoding(char*, int);
  18.  
  19. int main(int argc, char* argv[]) {
  20.  
  21. int i, shift = 0;
  22. int counter_code = 0, counter_decode = 0;
  23. char *code, *bad_decode;
  24. int code_length, bad_decode_length;
  25.  
  26. code = NULL, code_length = 0;
  27. bad_decode = NULL, bad_decode_length = 0;
  28.  
  29. //cteni sifry
  30. code = read_line(&code_length);
  31. //pokud jsme nacetli sifru, tak muzeme nacist i spatny decode
  32. if ( code ) {
  33. bad_decode = read_line(&bad_decode_length);
  34. }
  35. //zjisteni delky sifry
  36. for (i = 0; i < strlen(code); i++) {
  37. counter_code += 1;
  38. }
  39. //zjisteni delky spatneho decodu
  40. for (i = 0; i < strlen(bad_decode); i++) {
  41. counter_decode += 1;
  42. }
  43. //pokud sifra obsahuje nespravne znaky
  44. for ( i = 0; i < counter_code; i++ ) {
  45. if ( isalpha(code[i]) == 0 ) {
  46. fprintf(stderr, "Error: Chybny vstup!\n");
  47. return 100;
  48. }
  49. }
  50. //pokud spatne desifrovani obsahuje nespravne znaky
  51. for ( i = 0; i < counter_decode; i++ ) {
  52. if ( isalpha(bad_decode[i]) == 0 ) {
  53. fprintf(stderr, "Error: Chybny vstup!\n");
  54. return 100;
  55. }
  56. }
  57. //pokud delky nejsou stejne
  58. if ( counter_code != counter_decode ) {
  59. fprintf(stderr, "Error: Chybna delka vstupu!\n");
  60. return 101;
  61. }
  62. //pokud vsechno je v poradku
  63. shift = search_shift(code, bad_decode);
  64. good_decoding(code, shift);
  65. free(code);
  66. free(bad_decode);
  67. return 0;
  68. }
  69.  
  70. char *read_line(int *line_length) {
  71.  
  72. int capacity = FIRST_LEN;
  73. char *line = malloc(capacity + 1);
  74. int length = 0;
  75.  
  76. if ( line == NULL ) {
  77. fprintf(stderr, "Error: Chybny vstup!\n");
  78. }
  79. else {
  80. int letter;
  81. while ( (letter = getchar()) != EOF && letter != '\n' ) {
  82. if (length == capacity) {
  83. char *line_v2 = realloc(line, capacity * 2);
  84. if ( line_v2 == NULL ) {
  85. free(line);
  86. line = NULL;
  87. length = 0;
  88. break;
  89. }
  90. capacity *= 2;
  91. line = line_v2;
  92. }
  93. line[length++] = letter;
  94. }
  95. }
  96. *line_length = length;
  97. return line;
  98. }
  99.  
  100. int search_shift(char *code, char *bad_decode) {
  101. int k, i, j;
  102. int counter = 0, minimum = 0, shift = 0;
  103.  
  104. for ( k = 0; k < LEN_AlPHA; k++ ) {
  105. for ( i = 0; i < strlen(code); i++ ) {
  106. if( code[i] == 'Z' ) {
  107. code[i] = 'z';
  108. code[i] = code[i] - ENG;
  109. }
  110. if ( code[i] == 'z' ) {
  111. code[i] = 'Z';
  112. code[i] = code[i] - ENG;
  113. }
  114. if ( (code[i] != 'Z') || (code[i] != 'z') ) {
  115. code[i]=code[i] + 1;
  116. }
  117. }
  118.  
  119. for( j = 0; j < strlen(code); j++ ) {
  120. if ( code[j] == bad_decode[j] ) {
  121. counter += 1;
  122. }
  123. }
  124. if ( counter > minimum ) {
  125. minimum = counter;
  126. shift = k + 1;
  127. }
  128. counter = 0;
  129. }
  130. return shift;
  131. }
  132.  
  133. int good_decoding (char* code, int shift) {
  134. int k, b;
  135. for ( k = 0; k < shift; k++ ) {
  136. for ( b = 0; b < strlen(code); b++ ) {
  137. if( code[b] == 'Z' ) {
  138. code[b] = 'z';
  139. code[b] = code[b] - ENG;
  140. }
  141. if ( code[b] == 'z' ) {
  142. code[b] = 'Z';
  143. code[b] = code[b] - ENG;
  144. }
  145. if ( (code[b] != 'Z') || (code[b] != 'z') ) {
  146. code[b]=code[b] + 1;
  147. }
  148. }
  149. }
  150. printf("%s\n", code);
  151. return 0;
  152. }
  153.  
Success #stdin #stdout 0s 4368KB
stdin
xUbbemehbT
XYlloworld
stdout
Helloworld