Algorithm


Problem Name: 2 AD-HOC - beecrowd | 2464

Problem Link: https://www.beecrowd.com.br/judge/en/problems/view/2464

Decifra

 

Por OBI - Olimpíada Brasileira de Informática 2014 BR Brazil

Timelimit: 1

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!

 

Entrada

 

A primeira linha da entrada contém uma sequência de 26 letras minúsculas distintas, representando a permutação inversível usada na frase criptografada. A permutação é a seguinte: a letra “a” é trocada pela primeira letra dessa sequência; a letra “b” é trocada pela segunda letra dessa sequência; a letra “c” pela terceira; e assim por diante, seguindo a sequência padrão do alfabeto: abcdefghijklmnopqrstuvwxyz. A segunda linha da entrada consiste de uma frase criptografada, contendo apenas letras minúsculas (a frase criptografada não excede 104 caracteres).

 

Saída

 

Seu programa deve imprimir o texto original, de acordo com a permutação fornecida.

 

 

 

Exemplos de Entrada Exemplos de Saída

zcbedfghljkinmypqrutsvwxoa
bzedzeymziluz

cadeadonalisa

 

Code Examples

#1 Code Example with C Programming

Code - C Programming


#include <stdio.h>

unsigned short posiLetraOriginal(char *, char);

int main (void)
{

	unsigned short i;
	char cifra[27], original[] = "abcdefghijklmnopqrstuvwxyz";
	char textoCifrado[10100], textoDecifrado[10100];

	scanf("%s", cifra);
	scanf("%s", textoCifrado);

	i = 0;
	while (textoCifrado[i])
	{
		// a função posiLetraOriginal() procura a posição da letra do texto
		// cifrado  dentro do alfabeto cifrado. Uma vez que as letras foram
		// apenas trocadas de lugar, quem estiver na posição, 2, por exemplo,
		// no alfabeto cifrado "zc'b'edfghljkinmypqrutsvwxoa". Eu sei que deveria ser
		// A letra 'c', pois no alfabeto original, quem está nessa posição é o c,
		// Por isso, a posição da letra errada no alfabeto cifrado é retornada como
		// índice no alfabeto original, que irá retornar então, a letra correta;
		textoDecifrado[i] = original[posiLetraOriginal(cifra, textoCifrado[i])];
		i++;

	}

	textoDecifrado[i] = '\0';
	printf("%s\n", textoDecifrado);

}

unsigned short posiLetraOriginal(char *cifra, char letra)
{

	unsigned short i;

	i = 0;

	while (cifra[i])
	{

		if (cifra[i] == letra)
			return i;

		i++;

	}

}
Copy The Code & Try With Live Editor

Input

x
+
cmd
zcbedfghljkinmypqrutsvwxoa
bzedzeymziluz

Output

x
+
cmd
cadeadonalisa

#2 Code Example with C++ Programming

Code - C++ Programming


#include <cstdio>
#include <cstring>
char conv[1000], entrada[10100];
int main() {
    for (char c = 'a'; c  < = 'z'; c++) {
        scanf("%c", &conv[c]);
    }
    scanf("%s", entrada);
    for (int i = 0; i  <  strlen(entrada); i++) {
        printf("%c", conv[entrada[i]]);
    }
    printf("\n");
    return 0;
}
Copy The Code & Try With Live Editor

Input

x
+
cmd
zcbedfghljkinmypqrutsvwxoa
bzedzeymziluz

Output

x
+
cmd
cadeadonalisa

#3 Code Example with Javascript Programming

Code - Javascript Programming


const { readFileSync } = require("fs")
const [sequence, encryptedText] = readFileSync("/dev/stdin", "utf8").split("\n")

class CipherDecoder {
	#cypher
	constructor(initSequence) {
		const ORDENED_ALPHABET = "abcdefghijklmnopqrstuvwxyz"

		this.#cypher = new Map(
			Array.from([...initSequence.substring(0, ORDENED_ALPHABET.length)], (char, index) => [char, ORDENED_ALPHABET.charAt(index)])
		)
	}

	decrypt(encryptedText = "") {
		return [...encryptedText].map(char => this.#cypher.get(char.toLowerCase()) ?? char).join("")
	}
}

function main() {
	const decryptedText = new CipherDecoder(sequence).decrypt(encryptedText)
	console.log(decryptedText)
}

main()
Copy The Code & Try With Live Editor

Input

x
+
cmd
zcbedfghljkinmypqrutsvwxoa
bzedzeymziluz

Output

x
+
cmd
cadeadonalisa

#4 Code Example with Python Programming

Code - Python Programming


abc = 'abcdefghijklmnopqrstuvwxyz'
xyz = input()
frs = input()
for i in frs:
   print(abc[xyz.find(i)], end='')
print()
Copy The Code & Try With Live Editor

Input

x
+
cmd
zcbedfghljkinmypqrutsvwxoa
bzedzeymziluz

Output

x
+
cmd
cadeadonalisa
Advertisements

Demonstration


Previous
#2463 Beecrowd Online Judge Solution 2463 Corredor Solution in C, C++, Java, Js and Python
Next
#2465 Beecrowd Online Judge Solution 2465 Passa Bolinha Solution in C, C++, Java, Js and Python