Plataforma: URI (BEECROWD)
Problema: 1263
Linguagens: C e 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