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 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 |
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
bzedzeymziluz
Output
#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
bzedzeymziluz
Output
#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
bzedzeymziluz
Output
#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
bzedzeymziluz
Output