Pesquisar este blog

Livros Recomendados

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

sexta-feira, 12 de março de 2021

URI (BEECROWD) - 2464 - Decifra - Ad-Hoc - C e C++

Mais um exercício Ad-Hoc do URI/BEECROWD! Esse é o Decifra.

Plataforma: URI (BEECROWD)

Problema2464

Enunciado:

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!

Linguagens: C e C++

Solução:

A lógica aplicada foi a mesma em C e C++, após ler os valores, somava o índice da palavra zoada (variável j) com 97 e imprimia isso formatado como char, ou seja, esta soma era para chegar no valor decimal correspondente ao caractere correto pela tabela ASCII.

Eu pensei nesse exercício assim, mas há outras formas de solução. E você, como fez?

Código em C:

#include <stdio.h>
#include <string.h>
int main() {
    
    int i;
    int j;
    char zoado[27];
    char frase[10001];
    scanf("%s ", zoado);
    scanf("%s ", frase);
    
    for (i = 0; i < strlen(frase); i++)
        for (j = 0; j < strlen(zoado); j++)
            if (frase[i] == zoado[j]) {
                printf("%c", (char) (97+j));
                break;
            }
    printf("\n");
    
    return 0;
}

Código em C++:

#include <iostream>

using namespace std;

int main() {
    string zoado, frase;
    cin >> zoado;
    cin >> frase;
    
    for (int i = 0; i < frase.size(); i++)
        for (int j = 0; j < zoado.size(); j++)
            if (frase[i] == zoado[j]) {
                cout << (char) (97+j);
                break;
            }
    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