Pesquisar este blog

Livros Recomendados

Mostrando postagens com marcador 2502. Mostrar todas as postagens
Mostrando postagens com marcador 2502. Mostrar todas as postagens

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

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