Olá! Vamos com mais um post da categoria Strings! Dessa vez, resolvido em três linguagens!
Veja abaixo, as minhas soluções para esse problema!
Mais uma vez, faço a vocês um pedido: ajudem o blog! A chave PIX (chave aleatória) é 6d8bc7a8-5d74-493a-ab7a-3515baf35956. Qualquer valor ajudará muito, obrigado mais uma vez!
Plataforma: URI (BEECROWD)
Problema: 3358
Enunciado:
A região sul do Brasil é caracterizada pela ascendência multicultural de seus habitantes, sendo principalmente europeus e sobretudo italianos, alemães e poloneses. Uma consequência interessante disso é a variação na dificuldade na pronúncia dos sobrenomes da população, o que as vezes dificulta a vida dos professores na realização da chamada de sua turma, gerando até situações constrangedoras. Dada a possibilidade de constrangimento em suas aulas, a professora Jiraiya decidiu pesquisar os sobrenomes em sua lista de chamadas. Na concepção de Jiraiya, um sobrenome é difícil se tiver três ou mais consoantes consecutivas.
Linguagem: C, C++ e Haskell
Solução:
Para identificar se o sobrenome é difícil é só achar três consoantes consecutivas. Comparar o caractere com cada consoante é custoso, então a estratégia é comparar com as vogais, que são menos. O que fica mais trabalhoso é que essa comparação deve acontecer tanto com maiúsculas quanto com minúsculas, ou é necessário criar ou usar uma função pronta uma para passar todo caractere para minúsculo na comparação. Assim, apenas verifico se o caractere não é vogal por três caracteres consecutivos, o que resultará em sobrenome difícil.
#include <stdio.h> size_t obtemTamanho(const char* s) { int i = 0; while (s[i] != '\0') i++; return i; } int ehVogal(char c) { return c == 'a' || c == 'A' || c == 'e' || c == 'E' || c == 'i' || c == 'I' || c == 'o' || c == 'O' || c == 'u' || c == 'U'; } int main() { int n; char sobrenome[45]; scanf("%d", &n); while (n--) { scanf("%s", sobrenome); int tamanho = obtemTamanho(sobrenome); int consoantesConsecutivas = 0; int dificil = 0; for (int i = 0; i < tamanho; i++) { if (ehVogal(sobrenome[i])) consoantesConsecutivas = 0; else consoantesConsecutivas++; if (consoantesConsecutivas == 3) { dificil = 1; break; } } if (dificil) printf("%s nao eh facil\n", sobrenome); else printf("%s eh facil\n", sobrenome); } return 0; }
#include <iostream> #include <string> using namespace std; bool ehVogal(char c) { return c == 'a' || c == 'A' || c == 'e' || c == 'E' || c == 'i' || c == 'I' || c == 'o' || c == 'O' || c == 'u' || c == 'U'; } int main() { int n; string sobrenome; cin >> n; while (n--) { cin >> sobrenome; int tamanho = sobrenome.size(); int consoantesConsecutivas = 0; int maiorSequencia = 0; bool dificil = false; for (int i = 0; i < tamanho; i++) { if (ehVogal(sobrenome[i])) consoantesConsecutivas = 0; else consoantesConsecutivas++; if (consoantesConsecutivas == 3) { dificil = true; break; } } if (dificil) cout << sobrenome << " nao eh facil" << endl; else cout << sobrenome << " eh facil" << endl; } return 0; }
main :: IO () main = do n <- readLn reading n ehVogal :: Char -> Bool ehVogal c = c == 'a' || c == 'A' || c == 'e' || c == 'E' || c == 'i' || c == 'I' || c == 'o' || c == 'O' || c == 'u' || c == 'U' ehDificil :: [Char] -> Int -> Bool ehDificil [] 3 = True ehDificil [] _ = False ehDificil (x:xs) n = if n == 3 then True else if ehVogal x then ehDificil xs 0 else ehDificil xs (n+1) reading :: Int -> IO () reading n = do if n == 0 then return () else do sobrenome <- getLine let resposta = ehDificil sobrenome 0 if resposta then putStrLn (sobrenome ++ " nao eh facil") else putStrLn (sobrenome ++ " eh facil") reading (n - 1)