TOPIC

PROBLEM 1664 - URI Fórum 1.0

URI Online Judge asked 6 years ago

URI Online Judge Fórum 1.0

MOD

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 4 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 {
        BufferedReader br = new BufferedReader(
                new InputStreamReader(System.in));
        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 5 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 5 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);
    }