Pesquisar este blog

Livros Recomendados

terça-feira, 12 de maio de 2020

URI (BEECROWD) - 1024 - Criptografia - Strings - C

Resolvendo aqui o problema "Criptografia" Quando este exercício foi solucionado, ele era o segundo exercício mais resolvido da categoria Strings, o que pode sugerir que ele seja um dos mais fáceis :)

Vamos ver a solução proposta?

Plataforma: URI (BEECROWD)
Problema1024

Enunciado:
Solicitaram para que você construisse um programa simples de criptografia. Este programa deve possibilitar enviar mensagens codificadas sem que alguém consiga lê-las. O processo é muito simples. São feitas três passadas em todo o texto.

Na primeira passada, somente caracteres que sejam letras minúsculas e maiúsculas devem ser deslocadas 3 posições para a direita, segundo a tabela ASCII: letra 'a' deve virar letra 'd', letra 'y' deve virar caractere '|' e assim sucessivamente. Na segunda passada, a linha deverá ser invertida. Na terceira e última passada, todo e qualquer caractere a partir da metade em diante (truncada) devem ser deslocados uma posição para a esquerda na tabela ASCII. Neste caso, 'b' vira 'a' e 'a' vira '`'.

Por exemplo, se a entrada for “Texto #3”, o primeiro processamento sobre esta entrada deverá produzir “Wh{wr #3”. O resultado do segundo processamento inverte os caracteres e produz “3# rw{hW”. Por último, com o deslocamento dos caracteres da metade em diante, o resultado final deve ser “3# rvzgV”.

Linguagem: C
 
Solução:

A proposta dessa solução envolve criar um array de caracteres, chamado palavra, com tamanho máximo mil, e realizar as ações solicitadas no enunciado do problema: primeiro verificou-se se o caractere era letra, em caso positivo somava-se 3. Depois, inverteu-se a linha com ajuda de uma variável auxiliar "letra", trocando de lugar o i-ésimo caractere com o caractere da posição n-i-1. No fim, bastava percorrer o array de caracteres do meio para o fim e diminuir 1 do elemento, pois deslocar para a esquerda significa retornar uma posição. Ao imprimir a palavra resultante é necessário usar "\n" para quebrar a linha.

#include <stdio.h>

int main() {
    
    int n, i = 0, j;
    char *palavra = (char *) malloc(sizeof(char) * 1000);;

    scanf("%d ", &n);
    int tamanho[n];
    
    while (i < n) {
        gets(palavra);
        
        tamanho[i] = 0;
        while (palavra[tamanho[i]] ^ '\0')
            tamanho[i]++;

        j = 0;            
        while (j < tamanho[i]) {
            
            if ((palavra[j] >= 97 && palavra[j] <= 122)
            || ((palavra[j] >= 65 && palavra[j] <= 90)))
                palavra[j] = (char) (palavra[j] + 3);
            
            j++;
        }
        
        j = 0;
        while (j < tamanho[i] >> 1) {
            
            char letra = palavra[j];
            palavra[j] = palavra[tamanho[i]-j-1];
            palavra[tamanho[i]-j-1] = letra;
            
            j++;
            
        }
        
        j = tamanho[i] >> 1;
        while (j < tamanho[i]) {
            
            palavra[j] = (char) (palavra[j] - 1);
            
            j++;
            
        }
        
        printf("%s\n", palavra);
        
        i++;
    }
    
    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