Pesquisar este blog

Livros Recomendados

domingo, 17 de dezembro de 2023

URI (BEECROWD) - 3358 - Surname is not Easy (Sobrenome Não é Fácil) - Strings - C, C++ e Haskell

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)

Problema3358

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.


Código em C:

Há várias soluções possíveis. Na minha, apenas leio o texto e o percorro verificando se o caractere atual é vogal. Se durante essa varredura ele já encontrar três consoantes seguidas, interrompe essa repetição e imprime o resultado. Caso contrário, vai até o fim do laço até saber se há ou não três consoantes consecutivas para responder se é ou não é fá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;
}

Código em C++:

Outra solução que utiliza a mesma estratégia, mas em C++. Aqui aproveito o uso do tipo string e a existência da função size, mas a lógica segue exatamente a mesma do código em C.

#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;
}

Código em Haskell:

Aqui em Haskell, usando lógica parecida também. Porém, declarei uma função ehDificil para já retornar um booleano (valor lógico) quando o sobrenome for difícil.

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)

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