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)
Problema: 1632
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.
#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; }
#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; }
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)