Mais um exercício Ad-Hoc do URI/BEECROWD! Esse é o Decifra.
Plataforma: URI (BEECROWD)
Problema: 2464
Enunciado:
Dimas é um renomado investigador de roubos a antiguidades e obras de arte, que sempre é chamado para casos intrigantes que necessitam de bastante trabalho mental. Desta vez, o quadro que sumiu de um conhecido museu na França foi a Donalisa, do pintor Leonardo da Silva. Este é um caso bastante especial, visto que o ladrão deixou uma frase escrita na parede, aparentemente criptografada. Que desafio para Dimas! É que ele não tem muito conhecimento nessa área de criptografia. Porém, ele usou de suas excelentes observações e conseguiu perceber que a frase foi escrita através de alguma permutação inversível do alfabeto.
Uma permutação inversível do alfabeto é apenas uma troca entre suas letras, duas a duas. Por exemplo, todo “a” será trocado por “m” e, portanto, todo “m” será trocado por “a”. Dessa forma, veja que dado um texto original, se aplicarmos a permutação, teremos uma frase criptografada; e se aplicarmos a mesma permutação novamente, teremos o texto original recuperado!
Apesar de parecer fácil, a tradução se tornou uma tarefa difícil, já que a frase é bastante longa. É por isso que Dimas resolveu pedir sua ajuda, um exímio programador, para traduzir a frase criptografada, recuperando o texto original, e resolver o mistério!
Linguagens: C e C++
Solução:
A lógica aplicada foi a mesma em C e C++, após ler os valores, somava o índice da palavra zoada (variável j) com 97 e imprimia isso formatado como char, ou seja, esta soma era para chegar no valor decimal correspondente ao caractere correto pela tabela ASCII.
Eu pensei nesse exercício assim, mas há outras formas de solução. E você, como fez?
Código em C:
#include <stdio.h> #include <string.h> int main() { int i; int j; char zoado[27]; char frase[10001]; scanf("%s ", zoado); scanf("%s ", frase); for (i = 0; i < strlen(frase); i++) for (j = 0; j < strlen(zoado); j++) if (frase[i] == zoado[j]) { printf("%c", (char) (97+j)); break; } printf("\n"); return 0; }
Código em C++:
#include <iostream> using namespace std; int main() { string zoado, frase; cin >> zoado; cin >> frase; for (int i = 0; i < frase.size(); i++) for (int j = 0; j < zoado.size(); j++) if (frase[i] == zoado[j]) { cout << (char) (97+j); break; } cout << endl; return 0; }