Faça a seguinte metodologia, escreva cono comentário, em português, os passos que você vai identificando que precisa fazer. Cada passo uma linha. Após isso tente ir identificando o passo seguinte até o objetivo.
Depois você vai estudar na doc ou pesquisando mesmo, como resolver cada passo e faz o código abaixo de cada comentário. Isso ajuda muito a não se perder.
Caso você trave na identificação dos passos seguintes, pule para resolver os que já identificou. É tentando que se aprende.
E sim, ai você vai usar metodos para percorrer array e manipulação de string. Tente que consegue
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();
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 paratrue
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.
obrigado. ajudou muito a explicação. vou tentar desenvolver mai a minha lógica com essas dicas...
Essa de escrever um pseudo código é ótima. Eu até uso o pseudo código no meu prompt do Chat quando travo e peço para ele avaliar se a solução é boa e continuar a partir dali, se for.