Pesquisar este blog

Livros Recomendados

Mostrando postagens com marcador Sobrenome. Mostrar todas as postagens
Mostrando postagens com marcador Sobrenome. Mostrar todas as postagens

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)

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