Pesquisar este blog

Livros Recomendados

domingo, 14 de março de 2021

URI (BEECROWD) - 2502 - Decifrando a Carta Criptografada - Iniciante - C e C++

Decifrando a Carta Criptografada é o exercício que disponibilizo a solução aqui! Confiram!

Plataforma: URI (BEECROWD)

Problema2502

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;
}

Código em C++:

#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

Postagem em destaque

URI (BEECROWD) - 2158 - Helping Uncle Cláudio (Ajudando o Tio Cláudio) - Matemática - C, C++ e Haskell

Buenas! Estou aqui mais uma vez para resolver um problema de Matemática! Agora tenho resolvido alguns dessa categoria, pra que vocês possam ...

Postagens mais visitadas