# TOPIC

PROBLEM 1664 - URI Fórum 1.0

#### URI Online Judge asked 5 years ago

URI Online Judge Fórum 1.0

This topic was solved and cannot recieve new replies.

• #### lincoln replied 3 years ago

A dica que dou é prestar atenção ao remover as duplicadas 'aa' e 'Aa' são consideradas palavras iguais pelo problema

• #### Rafael Santana replied 3 years ago

Pessoal, estou recebend WA 100%. Alguém teria alguns casos de teste? O uDebug parece estar com problemas e os casos que consegui pensar, passaram.

```private static final String BULLSHIT = "BULLSHIT";

public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(System.out));
String input;
StringBuffer sb = new StringBuffer();
while ((input = br.readLine()) != null) {
sb.append(removeDuplicates(input.replaceAll("(\\S)([!@#\$%¨*()-=+<>;\"',0-9]+)(\\S)", "\$1\$3"))).append(" ");
}

String word = sb.toString();
int countBullshit = countBullShit(word);
if (!word.endsWith(BULLSHIT)) {
word = word.substring(0, word.lastIndexOf(BULLSHIT) + BULLSHIT.length()); // Ignoro as palavras após do último jogo (inacabado)
}
String[] words = word.replaceAll("BULLSHIT", "").trim().split("[^a-zA-Z]+");
bw.write(asFraction(words.length, countBullshit) + "\n");
bw.flush();
}

private static int countBullShit(String input) {
return (input.length() - input.replaceAll(BULLSHIT, "").length()) / BULLSHIT.length();
}

private static String removeDuplicates(String input) {
String[] splitted = input.split(" ");
StringBuffer generalBuffer = new StringBuffer();
StringBuffer internalBuffer = new StringBuffer();
for (int i = 0; i < splitted.length; i++) {
String curr = splitted[i];
if (curr.equals(BULLSHIT)) {
generalBuffer.append(" ").append(curr);
internalBuffer.setLength(0);
} else if (!internalBuffer.toString().contains(curr)) {
generalBuffer.append(" ").append(curr);
internalBuffer.append(" ").append(curr);
}
}
return generalBuffer.substring(1);
}

private static int gcm(int a, int b) {
// Euclides
return b == 0 ? a : gcm(b, a % b);
}

private static String asFraction(int a, int b) {
// Retorna em fração
int gcm = gcm(a, b);
return (a / gcm) + " / " + (b / gcm);
}```
• #### Matheus Leão replied 4 years ago

Pareceu que nesse caso o toolkit considerou que os jogos tem pelo menos uma palavra. De qualquer forma, o meu código passou e a saída gerada por esse caso foi 4 / 3.

• #### Old man replied 4 years ago

Eu devo considerar que as respostas do toolkit estão corretas?

Pois para esse caso de teste:

`BULLSHIT ate que BULLSHIT seja exclamado BULLSHIT`

Ele retorna:

`1 / 1`

Porém o certo não seria?

`4 / 3`

Estou certo ou errado? Se eu estiver errado, alguém pode me explicar o por quê?

• #### Marcos Treviso replied 5 years ago

Era isso mesmo, também vale a dica de que não precisa do s no fim dos colchetes. E temos que ler mais um caractere depois disso. Resolvi assim:

```while(scanf("%[A-Za-z]", palavra) != EOF){
scanf("%c", &c);
...
}```

Valeu aí Matheus!

• #### Matheus Leão replied 5 years ago

Você pode fazer algo do tipo:

`scanf("%[A-Za-z]s", nome);`
• #### Marcos Treviso replied 5 years ago

Será que tem como ler somente letras usando uma regra de scanf? Tentei algo do tipo:

`while(scanf("%[^!@#\$&-=+?.,<>:]%c", palavra, &c)  != EOF)`

Mas não deu muito certo e acabei lendo char por char.

Valeu!

• #### Matheus Leão replied 5 years ago

As palavras são compostas só por letras, então se eu escrevo oi! a palavra só é oi ( '!' é "não-letra") Teste este caso:

`oi! oi!! oi!!! BULLSHIT`

Só é utilizada uma palavra nesse exemplo.

• #### Wiliam Wessner replied 5 years ago

Eu estou recebendo Wrong answer(100%), o que tem de errado no meu código?

```#include<stdio.h>
#include<string.h>
int cont,x,igual,tam,ehPalavra,contPalavra,contBullshit,menor;
char palavra[26],guardarPalavra[1000][26];
int main()
{
contPalavra = 0;
contBullshit = 0;
while (scanf("%s",&palavra)!=EOF){
if (strcmp(palavra,"BULLSHIT") == 0){
cont = 0;
contBullshit++;
}
else{
igual = 0;
ehPalavra = 0;
tam = strlen(palavra);
for (x = 0; x < tam; x++){
if ((palavra[x] >= 'a' && palavra[x] <= 'z') || (palavra[x] >= 'A' && palavra[x] <= 'Z')){
ehPalavra = 1;
x = tam;
}
}
if (ehPalavra == 1){
for (x = 0; x < cont; x++){
if (strcasecmp(palavra,guardarPalavra[x]) == 0){
igual = 1;
x = cont;
}
}
if (igual == 0){
strcpy(guardarPalavra[cont],palavra);
cont++;
contPalavra++;
}
}

}
}
if (contPalavra > contBullshit){
menor = contBullshit;
}
else{
menor = contPalavra;
}

for (x = 2; x <= menor; x++){
if (contPalavra%x == 0 && contBullshit%x == 0){
contPalavra /= x;
contBullshit /= x;
x = 1;
if (contPalavra < 2 || contBullshit < 2){
x = menor+1;
}
}
}
printf("%d / %d\n",contPalavra,contBullshit);
}```