Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
2
respostas

[Projeto] Tá dificil entrar, tá dificil entrar, cava uma falta, cava uma falta que é gol!

const presenca = [1,1,1,0,0,0,1,1];

let graficoEmCaixa = [];
let grafico = [];
let linhaTotal = [];
let linha = [];
let maior = 0;
let menor = 0;
let espaço = [];
let graficoTexto = '';

function converterNumeros(p) {
    
    p.map((v, i) => {
        if (v === 1) {
            graficoEmCaixa.push('/');
        }
        if (v === 0 && p[i+1] === 0) {
            graficoEmCaixa.push('\\');
        } else if (v === 0 && p[i-1] === 0){
            graficoEmCaixa.push('\\');
        }
        if (v === 0 && p[i-1] !== 0 && p[i+1] !== 0) {
            graficoEmCaixa.push('_');
        }   
    });
}

function contadorDeLinha(gc) {
    
    gc.map((v, i) => {
        if (v === '/') {
            if (gc[i+1] === '\\') {
                linha.push(0);
            } else if (gc[i+1] === '_' || gc[i+1] === '/') {
                linha.push(1);
            }
        }
        if (v === '\\') {
            if (gc[i+1] === '/') {
                linha.push(0);
            } else if (gc[i+1] === '\\') {
                linha.push(-1);
            }
        }
        if (v === '_') {
            if (gc[i+1] === '/') {
                linha.push(0);
            }
        }
    });
    
    linhaTotal.push(linha[0]);
    linhaTotal.push(linhaTotal[0] + linha[1]);
    
    for (i = 2; i < linha.length; i++) {
        if (linha[i] === 1) {
            linhaTotal.push((linhaTotal[i-1] +1));
        }
        if (linha[i] === -1) {
            linhaTotal.push((linhaTotal[i-1] -1));
        }
        if (linha[i] === 0) {
            linhaTotal.push(linhaTotal[i-1]);
        }
    }
    maior = Math.max(...linhaTotal);
    menor = Math.min(...linhaTotal);
}
let j = 0;

function calculaEspaço(lt) {
    
    lt.map((v, i) => {
        if (v === maior) {
            espaço.push(i+1);
        }
    });
    //console.log({ espaço });
    return espaço;
}

function exibirGrafico(lt) {
    
    for (i = 0; lt.length +1 > i; i++) {

        if (graficoTexto === '') {
            graficoTexto += '\n';
        }
        if (espaço[j] !== i) {
            graficoTexto += ' ';
        } else {
            graficoTexto += graficoEmCaixa[espaço[j]];
            j++;
        }
        if ( i +2 > lt.length +1) {
            graficoTexto += '\n';
            maior -= 1;
            espaço = [];
            j = 0;
            i = - 1;
            let valorDaFuncao = calculaEspaço(linhaTotal);
            espaço = valorDaFuncao;
        }
        if (maior < menor) {
            console.log(graficoTexto);
            break;
        }
    }
}

if (presenca.length > 3) {
converterNumeros(presenca);
contadorDeLinha(graficoEmCaixa);
calculaEspaço(linhaTotal);
exibirGrafico(linhaTotal);
} else {
    console.error('\x1b[33mPara exibir o gráfico de presença é nescesário\nter no mínimo 4 presenças/faltas!\x1b[0m');
}

console.log({ graficoEmCaixa });
//console.log({ linhaTotal });
//console.log({ espaço });
//console.log(graficoEmCaixa[espaço]);

Oi
Eu fiz esse projeto para praticar lógica de programação!
eu tentei várias vezes, umas 4 tentativa para chegar nesse resultado!
foram projetos totalmente diferente desse!
esse foi o maior código que eu fiz até hoje! e o primeiro!
estou satisfeito mas sei que dá pra melhorar muito! não duvido nada
alguém fazer isso com metade das linhas que eu fiz!
ainda não está pronto! tem uns bugs que eu tentei resolver mas não consegui! mesmo usando IA!
e eu usei IA só no final do código para algumas coisas! e tbm usei para
pesquisar soluções melhores! tipo aquele Math.max!

O projeto consiste em fazer um gráfico de presença no console!

1 = presente = '/'
0 = faltou uma vez = '_'
e dois zeros consecutivos (0,0) = faltou mais de uma vez = ' \'

Alguém consegue arrumar os bugs!
e dar sugestões de melhoria ou de próximos projetos pra mim fazer!
eu agradeço!

Agora eu vou tomar um cafézinho! Tchau!

2 respostas
solução!

Olá, Ian. Como vai?

Parabéns pelo projeto! É muito gratificante ver o progresso de quem está começando e já se aventura em desafios de lógica mais complexos, como a construção de visualizações em modo texto no console. O fato de você ter tentado quatro abordagens diferentes demonstra uma característica essencial para qualquer pessoa desenvolvedora: a resiliência.

O seu código está bem estruturado e utiliza métodos importantes do JavaScript, como o .map(), além de manipulações de array. O uso de IA para aprender funções específicas, como o Math.max, é uma excelente estratégia de estudo.

Analisando os Bugs e Sugestões de Melhoria

Sobre os bugs que você mencionou, geralmente em gráficos ASCII (em texto), o maior desafio é a sincronização entre a altura da linha e a posição horizontal. Como o console imprime de cima para baixo, precisamos calcular toda a "matriz" ou o "mapa" do gráfico antes de começar a imprimir.

Aqui estão algumas sugestões para tornar seu código mais enxuto e resolver problemas de lógica:

  • Evite Variáveis Globais: No seu código, variáveis como j e espaço estão no escopo global e são modificadas dentro de funções. Isso costuma gerar bugs quando o código cresce. Tente passar esses valores como parâmetros e retorná-los das funções.
  • Simplificação da Lógica: Você pode usar um único laço de repetição para identificar o "desenho" de cada posição e armazená-los em uma matriz (um array de arrays).

Exemplo de Refatoração

Veja uma forma de simplificar a lógica de construção do gráfico, reduzindo a complexidade:

const presenca = [1, 1, 1, 0, 0, 0, 1, 1];

function gerarGrafico(dados) {
    if (dados.length < 4) {
        console.log("Mínimo de 4 registros necessários.");
        return;
    }

    // Traduzindo os números para símbolos
    let simbolos = dados.map((v, i) => {
        if (v === 1) return '/';
        if (v === 0 && (dados[i-1] === 0 || dados[i+1] === 0)) return '\\';
        return '_';
    });

    // Para um gráfico simples, podemos apenas imprimir a linha horizontal
    // ou montar uma lógica de níveis se quiser profundidade.
    console.log("Gráfico de Presença:");
    console.log(simbolos.join(''));
}

gerarGrafico(presenca);

Sugestões de Próximos Projetos

Para continuar evoluindo sua lógica, aqui estão três sugestões de desafios:

  1. Calculadora de IMC com histórico: Crie um script que peça peso e altura de vários usuários, armazene em um array de objetos e, ao final, mostre quem está acima do peso ideal.
  2. Conversor de Moedas com API: Tente usar o comando fetch no Node.js para buscar a cotação do dólar em tempo real e converter um valor digitado pelo usuário.
  3. Jogo de Forca no Console: Um clássico para praticar manipulação de strings, arrays e loops de repetição.

Aproveite seu café! Você está no caminho certo e essa satisfação de ver o código funcionando, mesmo que precise de ajustes, é o que move a nossa área.

Espero que possa ter lhe ajudado!

Nossa, pensei que você tinha feito o gráfico todo com só esse pequeno código!
mas depois eu entendi!

eu vou fazer aqueles projetos que você sugeriu!
e depois que terminar eu vou melhorar esse do gráfico de presença!

muito obrigado Evandro!

e pode deixar que eu peguei as suas dicas!