#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
// delka [a-z] nebo [A-Z]
#define ENG 26
// delka [a-zA-Z]
#define LEN_AlPHA 52
// zacatecni delka
#define FIRST_LEN 10
// funkce, ktera cte vstupni retezec
char *read_line(int *line_length);
//hledani delky posunu pri kodovani
int search_shift(char*, char*);
//desifrovani bez chyb
int good_decoding(char*, int);
int main(int argc, char* argv[]) {
int i, shift = 0;
int counter_code = 0, counter_decode = 0;
char *code, *bad_decode;
int code_length, bad_decode_length;
code = NULL, code_length = 0;
bad_decode = NULL, bad_decode_length = 0;
//cteni sifry
code = read_line(&code_length);
//pokud jsme nacetli sifru, tak muzeme nacist i spatny decode
if ( code ) {
bad_decode = read_line(&bad_decode_length);
}
//zjisteni delky sifry
for (i
= 0; i
< strlen(code
); i
++) { counter_code += 1;
}
//zjisteni delky spatneho decodu
for (i
= 0; i
< strlen(bad_decode
); i
++) { counter_decode += 1;
}
//pokud sifra obsahuje nespravne znaky
for ( i = 0; i < counter_code; i++ ) {
fprintf(stderr
, "Error: Chybny vstup!\n"); return 100;
}
}
//pokud spatne desifrovani obsahuje nespravne znaky
for ( i = 0; i < counter_decode; i++ ) {
if ( isalpha(bad_decode
[i
]) == 0 ) { fprintf(stderr
, "Error: Chybny vstup!\n"); return 100;
}
}
//pokud delky nejsou stejne
if ( counter_code != counter_decode ) {
fprintf(stderr
, "Error: Chybna delka vstupu!\n"); return 101;
}
//pokud vsechno je v poradku
shift = search_shift(code, bad_decode);
good_decoding(code, shift);
return 0;
}
char *read_line(int *line_length) {
int capacity = FIRST_LEN;
char *line
= malloc(capacity
+ 1); int length = 0;
if ( line == NULL ) {
fprintf(stderr
, "Error: Chybny vstup!\n"); }
else {
int letter;
while ( (letter
= getchar()) != EOF
&& letter
!= '\n' ) { if (length == capacity) {
char *line_v2
= realloc(line
, capacity
* 2); if ( line_v2 == NULL ) {
line = NULL;
length = 0;
break;
}
capacity *= 2;
line = line_v2;
}
line[length++] = letter;
}
}
*line_length = length;
return line;
}
int search_shift(char *code, char *bad_decode) {
int k, i, j;
int counter = 0, minimum = 0, shift = 0;
for ( k = 0; k < LEN_AlPHA; k++ ) {
for ( i
= 0; i
< strlen(code
); i
++ ) { if( code[i] == 'Z' ) {
code[i] = 'z';
code[i] = code[i] - ENG;
}
if ( code[i] == 'z' ) {
code[i] = 'Z';
code[i] = code[i] - ENG;
}
if ( (code[i] != 'Z') || (code[i] != 'z') ) {
code[i]=code[i] + 1;
}
}
for( j
= 0; j
< strlen(code
); j
++ ) { if ( code[j] == bad_decode[j] ) {
counter += 1;
}
}
if ( counter > minimum ) {
minimum = counter;
shift = k + 1;
}
counter = 0;
}
return shift;
}
int good_decoding (char* code, int shift) {
int k, b;
for ( k = 0; k < shift; k++ ) {
for ( b
= 0; b
< strlen(code
); b
++ ) { if( code[b] == 'Z' ) {
code[b] = 'z';
code[b] = code[b] - ENG;
}
if ( code[b] == 'z' ) {
code[b] = 'Z';
code[b] = code[b] - ENG;
}
if ( (code[b] != 'Z') || (code[b] != 'z') ) {
code[b]=code[b] + 1;
}
}
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCi8vIGRlbGthIFthLXpdIG5lYm8gW0EtWl0KI2RlZmluZSBFTkcgMjYKLy8gZGVsa2EgW2EtekEtWl0KI2RlZmluZSBMRU5fQWxQSEEgNTIKLy8gemFjYXRlY25pIGRlbGthIAojZGVmaW5lIEZJUlNUX0xFTiAxMAovLyBmdW5rY2UsIGt0ZXJhIGN0ZSB2c3R1cG5pIHJldGV6ZWMKY2hhciAqcmVhZF9saW5lKGludCAqbGluZV9sZW5ndGgpOwovL2hsZWRhbmkgZGVsa3kgcG9zdW51IHByaSBrb2RvdmFuaQppbnQgc2VhcmNoX3NoaWZ0KGNoYXIqLCBjaGFyKik7Ci8vZGVzaWZyb3ZhbmkgYmV6IGNoeWIKaW50IGdvb2RfZGVjb2RpbmcoY2hhciosIGludCk7CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CgkKCWludCBpLCBzaGlmdCA9IDA7CglpbnQgY291bnRlcl9jb2RlID0gMCwgY291bnRlcl9kZWNvZGUgPSAwOwogICAgY2hhciAqY29kZSwgKmJhZF9kZWNvZGU7CglpbnQgY29kZV9sZW5ndGgsIGJhZF9kZWNvZGVfbGVuZ3RoOwogICAgCiAgICBjb2RlID0gTlVMTCwgY29kZV9sZW5ndGggPSAwOwoJYmFkX2RlY29kZSA9IE5VTEwsIGJhZF9kZWNvZGVfbGVuZ3RoID0gMDsKCQogICAgLy9jdGVuaSBzaWZyeQoJY29kZSA9IHJlYWRfbGluZSgmY29kZV9sZW5ndGgpOwoJLy9wb2t1ZCBqc21lIG5hY2V0bGkgc2lmcnUsIHRhayBtdXplbWUgbmFjaXN0IGkgc3BhdG55IGRlY29kZQoJaWYgKCBjb2RlICkgewoJCWJhZF9kZWNvZGUgPSByZWFkX2xpbmUoJmJhZF9kZWNvZGVfbGVuZ3RoKTsKCX0KCS8vemppc3RlbmkgZGVsa3kgc2lmcnkKCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4oY29kZSk7IGkrKykgewoJCWNvdW50ZXJfY29kZSArPSAxOwoJfQoJLy96amlzdGVuaSBkZWxreSBzcGF0bmVobyBkZWNvZHUKCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4oYmFkX2RlY29kZSk7IGkrKykgewoJCWNvdW50ZXJfZGVjb2RlICs9IDE7Cgl9CgkvL3Bva3VkIHNpZnJhIG9ic2FodWplIG5lc3ByYXZuZSB6bmFreQoJZm9yICggaSA9IDA7IGkgPCBjb3VudGVyX2NvZGU7IGkrKyApIHsKCQlpZiAoIGlzYWxwaGEoY29kZVtpXSkgPT0gMCApIHsKCQkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogQ2h5Ym55IHZzdHVwIVxuIik7CgkJCXJldHVybiAxMDA7CgkJfQoJfQoJLy9wb2t1ZCBzcGF0bmUgZGVzaWZyb3Zhbmkgb2JzYWh1amUgbmVzcHJhdm5lIHpuYWt5Cglmb3IgKCBpID0gMDsgaSA8IGNvdW50ZXJfZGVjb2RlOyBpKysgKSB7CgkJaWYgKCBpc2FscGhhKGJhZF9kZWNvZGVbaV0pID09IDAgKSB7CgkJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IENoeWJueSB2c3R1cCFcbiIpOwoJCQlyZXR1cm4gMTAwOwoJCX0KCX0KCS8vcG9rdWQgZGVsa3kgbmVqc291IHN0ZWpuZQoJaWYgKCBjb3VudGVyX2NvZGUgIT0gY291bnRlcl9kZWNvZGUgKSB7CgkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogQ2h5Ym5hIGRlbGthIHZzdHVwdSFcbiIpOwoJCXJldHVybiAxMDE7Cgl9CiAgICAvL3Bva3VkIHZzZWNobm8gamUgdiBwb3JhZGt1CglzaGlmdCA9IHNlYXJjaF9zaGlmdChjb2RlLCBiYWRfZGVjb2RlKTsKCWdvb2RfZGVjb2RpbmcoY29kZSwgc2hpZnQpOwoJZnJlZShjb2RlKTsKCWZyZWUoYmFkX2RlY29kZSk7CglyZXR1cm4gMDsKfQoKY2hhciAqcmVhZF9saW5lKGludCAqbGluZV9sZW5ndGgpIHsKCQogICAgaW50IGNhcGFjaXR5ID0gRklSU1RfTEVOOwoJY2hhciAqbGluZSA9IG1hbGxvYyhjYXBhY2l0eSArIDEpOwoJaW50IGxlbmd0aCA9IDA7CgoJaWYgKCBsaW5lID09IE5VTEwgKSB7CgkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogQ2h5Ym55IHZzdHVwIVxuIik7Cgl9CgllbHNlIHsKCQlpbnQgbGV0dGVyOwoJCXdoaWxlICggKGxldHRlciA9IGdldGNoYXIoKSkgIT0gRU9GICYmIGxldHRlciAhPSAnXG4nICkgewoJCQlpZiAobGVuZ3RoID09IGNhcGFjaXR5KSB7CgkJCQljaGFyICpsaW5lX3YyID0gcmVhbGxvYyhsaW5lLCBjYXBhY2l0eSAqIDIpOwoJCQkJaWYgKCBsaW5lX3YyID09IE5VTEwgKSB7CgkJCQkJZnJlZShsaW5lKTsKCQkJCQlsaW5lID0gTlVMTDsKCQkJCQlsZW5ndGggPSAwOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJY2FwYWNpdHkgKj0gMjsKCQkJCWxpbmUgPSBsaW5lX3YyOwoJCQl9CgkJCWxpbmVbbGVuZ3RoKytdID0gbGV0dGVyOwoJCX0KCX0KCSpsaW5lX2xlbmd0aCA9IGxlbmd0aDsKCXJldHVybiBsaW5lOwp9CgppbnQgc2VhcmNoX3NoaWZ0KGNoYXIgKmNvZGUsIGNoYXIgKmJhZF9kZWNvZGUpIHsKCWludCBrLCBpLCBqOwoJaW50IGNvdW50ZXIgPSAwLCBtaW5pbXVtID0gMCwgc2hpZnQgPSAwOwoKCWZvciAoIGsgPSAwOyBrIDwgTEVOX0FsUEhBOyBrKysgKSB7CgkJZm9yICggaSA9IDA7IGkgPCBzdHJsZW4oY29kZSk7IGkrKyApIHsKCQkJaWYoIGNvZGVbaV0gPT0gJ1onICkgewoJCQkJY29kZVtpXSA9ICd6JzsKCQkJCWNvZGVbaV0gPSBjb2RlW2ldIC0gRU5HOwoJCQl9CgkJCWlmICggY29kZVtpXSA9PSAneicgKSB7CgkJCQljb2RlW2ldID0gJ1onOwoJCQkJY29kZVtpXSA9IGNvZGVbaV0gLSBFTkc7CgkJCX0KCQkJaWYgKCAoY29kZVtpXSAhPSAnWicpIHx8IChjb2RlW2ldICE9ICd6JykgKSB7CgkJCQljb2RlW2ldPWNvZGVbaV0gKyAxOwoJCQl9CgkJfQoKCQlmb3IoIGogPSAwOyBqIDwgc3RybGVuKGNvZGUpOyBqKysgKSB7CgkJCWlmICggY29kZVtqXSA9PSBiYWRfZGVjb2RlW2pdICkgewoJCQkJY291bnRlciArPSAxOwoJCQl9CgkJfQoJCWlmICggY291bnRlciA+IG1pbmltdW0gKSB7CgkJCW1pbmltdW0gPSBjb3VudGVyOwoJCQlzaGlmdCA9IGsgKyAxOwoJCX0KCQljb3VudGVyID0gMDsKCX0KCXJldHVybiBzaGlmdDsKfQoKaW50IGdvb2RfZGVjb2RpbmcgKGNoYXIqIGNvZGUsIGludCBzaGlmdCkgewogICAgaW50IGssIGI7CiAgICBmb3IgKCBrID0gMDsgayA8IHNoaWZ0OyBrKysgKSB7CgkJZm9yICggYiA9IDA7IGIgPCBzdHJsZW4oY29kZSk7IGIrKyApIHsKCQkJaWYoIGNvZGVbYl0gPT0gJ1onICkgewoJCQkJY29kZVtiXSA9ICd6JzsKCQkJCWNvZGVbYl0gPSBjb2RlW2JdIC0gRU5HOwoJCQl9CgkJCQlpZiAoIGNvZGVbYl0gPT0gJ3onICkgewoJCQkJY29kZVtiXSA9ICdaJzsKCQkJCWNvZGVbYl0gPSBjb2RlW2JdIC0gRU5HOwoJCQl9CgkJCWlmICggKGNvZGVbYl0gIT0gJ1onKSB8fCAoY29kZVtiXSAhPSAneicpICkgewoJCQkJY29kZVtiXT1jb2RlW2JdICsgMTsKCQkJfQoJCX0KCX0KCXByaW50ZigiJXNcbiIsIGNvZGUpOwogICAgcmV0dXJuIDA7Cn0K