Pesquisar este blog

Livros Recomendados

sexta-feira, 26 de março de 2021

URI (BEECROWD) - 1263 - Aliteração - Strings - C e C++ - Solução Alternativa

Plataforma: URI (BEECROWD)

Problema1263


Linguagens: C e C++

Enunciado:
Uma aliteração ocorre quando duas ou mais palavras consecutivas de um texto possuem a mesma letra inicial (ignorando maiúsculas e minúsculas). Sua tarefa é desenvolver um programa que identifique, a partir de uma sequência de palavras, o número de aliterações que essa sequência possui.

Solução em C++:

Ler todas as palavras (considerar palavra toda sequência de caracteres até o espaço ou o fim da linha) e pegar o primeiro caractere dela. Ao obter o caractere, testar se ele é minúsculo e, caso positivo, passá-lo para maiúsculo, padronizando assim os caracteres para a comparação. Se o primeiro caractere de cada palavra for igual, faz o incremento da variável n, mas antes a variável podeContar controla se já houve a contagem, caso em que a aliteração já foi calculada se houver mais palavras consecutivas iniciando pela mesma letra. Ao final basta imprimir o valor de n, não esquecendo da quebra de linha.

Código em C++:

#include <iostream>
#include <sstream>

using namespace std;

int main() {
    
    string linha, w;
    char anterior = ' ', l;
    int n;
    bool podeContar;
    
    while (getline(cin, linha)) {
        
        istringstream s(linha);
        n = 0;
        podeContar = true;
        
        while (getline(s, w, ' ')) {
            
            l = w[0];
            
            if (l >= 'a' and l <= 'z')
                l -= 32;
                
            if (anterior == l) {
                if (podeContar) {
                    n++;
                    podeContar = false;
                }
            }
            else
                podeContar = true;
                
            anterior = l;
        }
        
        cout << n << endl;
    }
    
    return 0;
}

Solução em C:

A função strtok observa a ocorrência de um token (neste caso, um espaço em branco) para dividir a cadeia de caracteres, e assim conseguir obter a primeira letra de cada palavra daquela linha. Esta primeira letra está disponível na variável l ou em w[0]. A estrutura for é responsável por esta iteração. A variável anterior obtém sempre a primeira letra da palavra anterior e, se for igual à variável l, temos uma aliteração. A variável podeContar funciona como um controlador booleano, pois ela só permitirá a contagem se a aliteração ainda não estiver sido registrada. Por exemplo, se três palavras seguidas representarem aliterações, o contador não poderia incrementar pela segunda vez, pois a aliteração já foi registrada.

Código em C:

#include <stdio.h>
#include <string.h>

int main() {
    
    char linha[5010], *w, anterior = ' ', l;
    int n, podeContar, i;
    
    while (scanf ("%[^\n]%*c", linha) != EOF) {
        
        n = 0;
        podeContar = 1;
        
        w = strtok(linha, " ");
        for (i = 0; w != NULL; i++) {
            
            l = w[0];
            
            if (l >= 'a' && l <= 'z')
                l = l - 32;
                
            if (anterior == l) {
                if (podeContar) {
                    n++;
                    podeContar = 0;
                }
            }
            else
                podeContar = 1;
                
            anterior = l;
            w = strtok(NULL, " ");
        }
        
        printf("%d\n", n);
    }
    
    return 0;
}

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