1
resposta

Resolução Amigo secreto

let listaAmigos = [];

function adicionar(){
    let receberNome = document.getElementById('nome-amigo').value.toUpperCase(); 
    let amigosIncluidos = document.getElementById('lista-amigos');
    let apenasLetras = /^[A-Za-zÀ-ÿ\s]+$/;

    if(apenasLetras.test(receberNome)){
        if('listaAmigos.includes(receberNomes){
            alert('Esse nome ja existe, por favor, escolha outro (EX: sobrenome)');
            return;
        listaAmigos.push(receberNome);
        amigosIncluidos.textContent = listaAmigos.join(', ');
        document.getElementById('nome-amigo').value = '';
    
    }else {
        alert('Por favor, escreva um nome válido apenas com letras');
    }
}

function sortear(){
    let sorteio = document.getElementById('lista-sorteio');
    let nomesEmbaralhados = embaralhar([...listaAmigos]);
    let resultadoSorteio = '';

    if(listaAmigos.length <= 2){
        alert('Quantidade de amigos insuficiente para o sorteio, minimo de 3 pessoas');
        return;
    }

    for(let i = 0; i < nomesEmbaralhados.length; i++){

        if( i == nomesEmbaralhados.length - 1){
            resultadoSorteio += nomesEmbaralhados[i] + '-->' + nomesEmbaralhados[0] + '<br>';

        }else{
            resultadoSorteio += nomesEmbaralhados[i] + '-->' + nomesEmbaralhados[i + 1] + '<br>';
        }
    }
    
    sorteio.innerHTML = resultadoSorteio;
}

function embaralhar(array) {
  let m = array.length;
  
  while (m) {
    const i = Math.floor(Math.random() * m--);
    [array[m], array[i]] = [array[i], array[m]];
  }
  return array;
} 

function reiniciar(){
    document.getElementById('lista-amigos').textContent = '';
    document.getElementById('lista-sorteio').textContent = '';
    listaAmigos = [];
}
1 resposta

Oi!

Parabéns pela resolução do desafio, Beatriz! Seu código demonstra um ótimo cuidado com a experiência de uso, especialmente ao implementar validações para garantir que apenas nomes válidos sejam inseridos e evitar duplicatas.

A lógica de sorteio utilizando o embaralhamento (algoritmo de Fisher-Yates) aliado à conexão do último elemento com o primeiro é a maneira mais segura de garantir que todos tirem alguém e que o ciclo se feche.

Pontos Positivos da sua Implementação

  • Validação com regex: O uso de /^[A-Za-zÀ-ÿ\s]+$/ é excelente. Ele garante que números ou caracteres especiais não entrem na lista, aceitando inclusive acentuação, o que é fundamental para nomes brasileiros.
  • Tratamento de duplicatas: Converter o nome para toUpperCase() antes de verificar com includes evita que o sistema aceite "Beatriz" e "beatriz" como pessoas diferentes, o que causaria confusão no sorteio.
  • Cópia do array: Ao usar [...listaAmigos], você cria uma cópia da lista original para embaralhar. Isso é uma boa prática para manter os dados originais intactos caso precise deles depois.

Ajustes importantes no Código

Notei alguns pequenos detalhes de sintaxe que podem impedir o código de rodar corretamente. Vamos ajustá-los:

  1. Erro de aspas e variável: Na linha do if('listaAmigos.includes(receberNomes){, há uma aspa sobrando no início e a variável correta é receberNome (no singular).
  2. Fechamento de chaves: O bloco do if que verifica nomes duplicados precisa ser fechado corretamente antes de adicionar o nome ao array.

Veja como ficaria esse trecho corrigido:

if(apenasLetras.test(receberNome)){
    // Verificando duplicidade corretamente
    if(listaAmigos.includes(receberNome)){
        alert('Esse nome já existe, por favor, escolha outro (EX: sobrenome)');
        return;
    }

    listaAmigos.push(receberNome);
    amigosIncluidos.textContent = listaAmigos.join(', ');
    document.getElementById('nome-amigo').value = '';

} else {
    alert('Por favor, escreva um nome válido apenas com letras');
}

Dica de lógica

No seu sorteio, você definiu o mínimo de 3 pessoas. Isso é interessante porque evita que o sorteio fique óbvio demais (em 2 pessoas, um necessariamente tiraria o outro).

A estrutura que você criou para o laço for está perfeita para criar o efeito de "corrente", onde cada pessoa tira a próxima da lista embaralhada e a última fecha o ciclo com a primeira.

Continue praticando essa organização de funções, pois separar a lógica de adicionar, sortear e reiniciar deixa o sistema muito fácil de entender e manter. Já pensou em adicionar um botão para remover um nome específico caso alguém desista da brincadeira?

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!