Executando verificação de segurança...
2

Wow,é bem assim que eu faço (fiz). mas quando eu chego no impasse, e vou ver a resposta, tem várias linhas que eu fico pensando (mas como assim?). São umas coisas que parecem que não faz parte da sintaxe da linguagem e aí eu penso, "por que ele escreveu isso?". Por exemplo;

for (const palavra of palavras) {
    palavrasUnicas[palavra] = true;
}

eu não entendo a parte que ele inicializa a variavel palavra (dentro do loop). quero dizer, como essa variável interege com o restante do código?

código completo:

function contarPalavrasUnicas(texto) {
    // Remover pontuações e converter para minúsculas
    const palavras = texto.toLowerCase().replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g, '').split(/\s+/);

    // Criar um objeto para armazenar as palavras únicas
    const palavrasUnicas = {};

    // Contar as palavras únicas
    for (const palavra of palavras) {
        palavrasUnicas[palavra] = true;
    }

    // Retornar o número de palavras únicas
    return Object.keys(palavrasUnicas).length;
}

// Exemplo de uso
const textoExemplo = "Olá, mundo! Olá, programação.";
const resultado = contarPalavrasUnicas(textoExemplo);
console.log(resultado);

as outras linhas eu compreendi, mas é isso que me deixa pensativo; será que eu conseguiria executar uma lógica assim, toda certinha, "redondinha"?

A mesma coisa nesse código abaixo, eu não consigo entender a linha do laço (FOR), tipo; a parte {adicionaraoconjunto(...)} essa parte é uma exoressão do javascript ou é só uma frase de multipla escolha?

function contadorPalavrasUnicas() {
    // Passo 1: Entrada
    let texto = prompt("Digite o texto:");

    // Passo 2: Preprocessamento
    texto = converterParaMinusculas(removerPontuacoes(texto));

    // Passo 3: Divisão em Palavras
    let listaPalavras = dividirEmPalavras(texto);

    // Passo 4: Contagem de Palavras Únicas
    let conjuntoPalavrasUnicas = new Set();
    for (let palavra of listaPalavras) {
        adicionarAoConjunto(conjuntoPalavrasUnicas, palavra);
    }

    // Passo 5: Saída
    console.log("Número de palavras únicas no texto:", tamanhoDoConjunto(conjuntoPalavrasUnicas));
}

function converterParaMinusculas(texto) {
    // Implementar a conversão para minúsculas
    return texto.toLowerCase();
}

function removerPontuacoes(texto) {
    // Implementar a remoção de pontuações
    return texto.replace(/[^\w\s]/g, "");
}

function dividirEmPalavras(texto) {
    // Implementar a divisão do texto em palavras
    return texto.split(/\s+/);
}

function adicionarAoConjunto(conjunto, elemento) {
    // Implementar a adição de um elemento ao conjunto
    // (tratando o elemento como case-insensitive)
    conjunto.add(elemento.toLowerCase());
}

function tamanhoDoConjunto(conjunto) {
    // Implementar a obtenção do tamanho do conjunto
    return conjunto.size;
}

// Chamar a função principal
contadorPalavrasUnicas();
6

eu não entendo a parte que ele inicializa a variavel palavra (dentro do loop). quero dizer, como essa variável interege com o restante do código?

Vc não entendeu o for (const palavra ou a linha palavrasUnicas[palavra] = true? Enfim, vamos lá:

Este é o for..of (ver documentação), que é basicamente uma forma de iterar pelos elementos de qualquer objeto iterável.

No caso, a cada iteração, a variável palavra será um dos elementos do array palavras.

Já a linha dentro do loop está criando propriedades dinâmicas no objeto palavrasUnicas.

Por exemplo, se o array palavras tiver as strings "abc", "cde" e "abc", o loop fará o seguinte:

  • na primeira iteração, palavrasUnicas terá a propriedade "abc" criada (e seu valor será true)
  • na segunda iteração, palavrasUnicas terá a propriedade "cde" criada (e seu valor será true)
  • na terceira iteração, palavrasUnicas terá a propriedade "abc" setada - lembre-se que ela já existia, pois foi criada na primeira iteração - e seu valor será novamente setado para true

No fim, palavrasUnicas terá duas propriedades, chamadas "abc" e "cde", ou seja, uma para cada palavra única.


Já no último código, adicionarAoConjunto é uma função que foi criada logo abaixo:

function adicionarAoConjunto(conjunto, elemento) {
    // Implementar a adição de um elemento ao conjunto
    // (tratando o elemento como case-insensitive)
    conjunto.add(elemento.toLowerCase());
}

Mas eu acho esse código desnecessariamente complicado. Primeiro que não precisa de tantas funções assim, segundo porque ele converte para minúsculas duas vezes: uma na função converterParaMinusculas e outra em adicionarAoConjunto, o que é redundante.

E claro, a definição de "palavra" pode variar muito e depende do contexto, e isso influencia em como o programa vai lidar com isso. Por exemplo, esse código não considera caracteres acentuados: teste com a string olá ol e ele vai dizer que só tem uma palavra única. Ele também considera que qualquer sequência de letras, dígitos e _ são palavras (teste com oi_ 123, vai considerar que são duas palavras).

Enfim, eu faria assim:

function contadorPalavrasUnicas(texto) {
    // palavra = sequência de 1 ou mais caracteres latinos
    return new Set(texto.toLowerCase().match(/\p{Script=Latin}+/ug)).size;
}

console.log(contadorPalavrasUnicas('olá, OLÁ, ola!!!')); // 2

E só: a regex considera uma sequência de 1 ou mais letras latinas, incluindo acentos. Não usei \w porque ele também considera dígitos e _. E usar \s restringe a espaços, mas ignora sinais de pontuação (outra falha do código original).

match retorna um array com as palavras, depois eu crio o Set (que é uma estrutura que por default elimina os valores repetidos) e retorno o tamanho dele. Não precisa de tantas funções assim (por exemplo, uma só pra retornar o tamanho, é um exagero).

Não quis complicar a definição de palavra, considerei apenas qualquer sequência de letras latinas, incluindo acentos. Também não considerei palavras compostas ou com apóstrofo (ou seja, "beija-flor" será contado como duas palavras, "gota d'água" serão três e não duas, etc).


Enfim, isso serve pra mostrar que o ChatGPT pode até ajudar, mas no fim ainda tem que analisar o que ele te respondeu. E se não souber o que está fazendo e só aceitar cegamente o que ele te dá, nem sempre o resultado será bom.

Eu vejo ele como um estagiário esforçado, porém ainda limitado. Tem que conferir o que ele faz, sempre.

1