Pesquisar este blog

Livros Recomendados

quarta-feira, 20 de dezembro de 2023

URI (BEECROWD) - 1632 - Variations (Variações) - Strings - C, C++ e Haskell

Hoje vamos apresentar a solução do problema Variations (Variações), da categoria Strings no Beecrowd. Não foi um problema difícil de resolver e acho que não terão dificuldades em entender o código :) Confira na sequência como eu resolvi esse problema!

Chave PIX para ajudar o blog: 6d8bc7a8-5d74-493a-ab7a-3515baf35956. 


Plataforma: URI (BEECROWD)

Problema1632

Enunciado:

A internet já não é tão segura quanto ela já foi. Um dos sinais disso é o aumento de ataque de hackers a diversos sites. Para piorar, quando um hacker rouba a senha de um usuário em um determinado site, ele tem também acesso a todas as outras contas deste usuário em outros sites, pois a maioria dos usuários hoje em dia usa a mesma senha em todos os sites que acessa.

Uma das soluções propostas para resolver este problema é usar diferentes senhas para cada site, ou até mesmo diferentes variações da mesma senha. Por exemplo, para variar a senha “batata”, é possível usar a senha “bAtaTa”, “B4tat4”, “baTATA”, etc. Ou seja, para cada caractere do alfabeto, é possível formar uma variação colocando tal caractere em maiúsculo ou minúsculo. Inclusive, para aumentar o número total de variações, para os caracteres A, E, I, O e S é possível usar também os números 4, 3, 1, 0 e 5, respectivamente.

Seu amigo precisa aumentar o número de variações de sua senha, e pediu sua ajuda. Dada a senha que ele escolheu, diga o número de diferentes variações que é possível montar.

Linguagem: C, C++ e Haskell


Solução: 

Basicamente a solução passa por verificar qual é o caractere em questão e substituí-lo pelo número correspondente, assim fazendo a multiplicação entre eles para gerar a resposta.

Código em C:


#include <stdio.h>

size_t obtemTamanho(const char *s) {
    size_t t = 0;
    while (++t)
        if (!s[t])
            return t;
}

int main() {
    unsigned int n;
    char senha[17];
    char c;
    unsigned int resposta;
    unsigned int i;

    scanf("%u", &n);
    while (n--) {
        scanf("%s", senha);
        resposta = 1;
        for (i = 0; i < obtemTamanho(senha); i++) {
            c = senha[i];
            if (c == 'a' || c == 'A' || c == 'e' || c == 'E' || c == 'i' || c == 'I' || c == 'o' || c == 'O' || c == 's' || c == 'S')
                resposta *= 3;
            else
                resposta *= 2;
        }
        printf("%u\n", resposta);
    }
    return 0; 
}

Código em C++:

O código em C++ segue a mesma lógica do código em C.

#include <iostream> 
#include <string>

int main() {
    unsigned int n;
    std::string senha;
    std::cin >> n;
    while (n--) {
        std::cin >> senha;
        int resposta = 1;
        for (int i = 0; i < senha.size(); i++) {
            char c = senha[i];
            if (c == 'a' || c == 'A' || c == 'e' || c == 'E' || c == 'i' || c == 'I' || c == 'o' || c == 'O' || c == 's' || c == 'S')
                resposta *= 3;
            else
                resposta *= 2;
        }
        std::cout << resposta << std::endl;
    }
    return 0; 
}

Código em Haskell:

Aqui também aplicou-se a mesma lógica, porém de forma recursiva.

main :: IO ()
main = do
   n <- readLn
   reading n

obtemVariacoes :: [Char] -> Int
obtemVariacoes [] = 1
obtemVariacoes (x:xs)
   | x == 'A' || x == 'a' || x == 'e' || x == 'E' || x == 'i' = 3 * obtemVariacoes xs
   | x == 'I' || x == 'o' || x == 'O' || x == 's' || x == 'S' = 3 * obtemVariacoes xs
   | otherwise = 2 * obtemVariacoes xs

reading :: Int -> IO ()
reading n = do
   if n == 0
      then return ()
      else do
         senha <- getLine
         print (obtemVariacoes senha)
         reading (n-1)

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