Decifrando a Carta Criptografada é o exercício que disponibilizo a solução aqui! Confiram!
Plataforma: URI (BEECROWD)
Problema: 2502
Enunciado:
A cifra mais antiga conhecida é a Cifra de César. César escrevia suas cartas trocando cada letra pela próxima do alfabeto, para evitar que, quando a carta fosse interceptada, conseguissem ler. Com o tempo, a criptografia adquiriu melhor qualidade, mas a criptografia por substituição ainda é uma brincadeira de criança interessante, por exemplo:
ZEN I T
POLAR
Neste tipo de brincadeira, ao escrever uma carta a letra Z é trocada pela letra P e vice versa, bem como: E e O e assim sucessivamente. A frase cifrada desta forma: "Osro roxre osri caftide" pode ser decifrada como: "Este texto esta cifrado". Como a brincadeira ficou séria, a você foi solicitado um programa que decifre as mensagens cifradas a partir de uma chave fornecida.
Linguagens: C e C++
Solução:
Código em C:
#include <ctype.h> #include <stdio.h> #include <string.h> int min(char c) { return (isupper(c)? 'a' + c -'A' : c); } int max(char c) { return (islower(c)? 'A' + c - 'a' : c); } int main() { int i, j, letras, palavras, cripto[1024]; char antigo[50], novo[50], linha[1024]; while (scanf("%d %d ", &letras, &palavras) != EOF) { for (i = 0; i < 1000; i++) cripto[i] = i; scanf("%[^\n]%*c", antigo); scanf("%[^\n]%*c", novo); for (i = 0 ; i < strlen(antigo); i++) { cripto[(int) antigo[i]] = max(novo[i]); if (isupper(antigo[i])) cripto['a' + antigo[i] - 'A'] = min(novo[i]); cripto[(int)novo[i]] = max(antigo[i]); if (isupper(novo[i])) cripto['a' + novo[i] - 'A'] = min(antigo[i]); } for (i = 0; i < palavras; i++) { scanf("%[^\n]%*c", linha); for (j = 0; j < strlen(linha); j++) printf("%c",(isupper(linha[j])? (char) max(cripto[(int) linha[j]]) : (char) min(cripto[(int) linha[j]]))); printf("\n"); } printf("\n"); } return 0; }
#include <cctype> #include <iostream> using namespace std; int min(char c) { return (isupper(c)? 'a' + c -'A' : c); } int max(char c) { return (islower(c)? 'A' + c - 'a' : c); } int main() { int i, j, letras, palavras, cripto[1024]; string antigo, novo, linha; while (cin >> letras >> palavras) { for (i = 0; i < 1000; i++) cripto[i] = i; cin.ignore(); getline(cin, antigo); getline(cin, novo); for (i = 0 ; i < antigo.size(); i++) { cripto[(int) antigo[i]] = max(novo[i]); if (isupper(antigo[i])) cripto['a' + antigo[i] - 'A'] = min(novo[i]); cripto[(int)novo[i]] = max(antigo[i]); if (isupper(novo[i])) cripto['a' + novo[i] - 'A'] = min(antigo[i]); } for (i = 0; i < palavras; i++) { getline(cin, linha); for (j = 0; j < linha.size(); j++) cout << (isupper(linha[j])? (char) max(cripto[(int) linha[j]]) : (char) min(cripto[(int) linha[j]])); cout << endl; } cout << endl; } return 0; }
Nenhum comentário:
Postar um comentário