Problemas clássicos de lógica resolvidos com JavaScript
Problemas clássicos de lógica resolvidos com JavaScript
Fala, dev! Preparado para botar a cabeça para funcionar e enfrentar alguns desafios de lógica? Hoje vamos resolver uma série de problemas clássicos com JavaScript, a linguagem queridinha de quem gosta de atuar tanto no front-end quanto no back-end. Além de praticar sua lógica, você vai aprender truques que podem salvar seu código em situações reais.
Então, ajeite-se na cadeira, pegue um café e… bora codar!
A lógica é a alma do código
A lógica de programação é essencial para criar um código eficiente. Não importa se você está fazendo um simples formulário ou um sistema de recomendação de filmes: a lógica é sempre o ponto de partida. E nada melhor do que exercitar com problemas que vão desde o cálculo de fatorial até algoritmos de busca.
JavaScript é uma escolha perfeita, pois é uma linguagem versátil e fácil de aprender. Além disso, muitos dos problemas que resolveremos aqui podem ser aplicados tanto no navegador quanto no Node.js.
Conceitos básicos de JavaScript
Antes de mergulharmos nos desafios, é importante garantir que você esteja com a base bem afiada. JavaScript é cheio de nuances e recursos que vão facilitar muito a sua vida ao resolver problemas de lógica. Vamos relembrar alguns conceitos fundamentais que usaremos ao longo dos exercícios:
- Controle de fluxo: estruturas como
if/else
,for
ewhile
são essenciais para controlar o comportamento do seu código.
- Manipulação de arrays: métodos como
map
,filter
ereduce
tornam o trabalho com listas de dados mais eficiente.
- Funções e closures: você encontrará muito uso para funções anônimas e arrow functions na construção de soluções limpas.
- Programação assíncrona: promises e async/await são indispensáveis para lidar com tarefas que exigem operações não bloqueantes.
Se você quer se aprofundar nesses conceitos e aprender ainda mais sobre JavaScript, não deixe de conferir esses artigos exclusivos da Rocketseat:
Agora, se você quer uma revisão rápida e eficiente para garantir que todos esses fundamentos estão fresquinhos na memória, é só dar o play no vídeo abaixo! Em menos de 30 minutos, você terá um panorama geral dos conceitos mais importantes:
Pronto? Agora sim, bora resolver alguns desafios juntos!
Par ou ímpar?
Vamos começar simples: descobrir se um número é par ou ímpar.
const ePar = (n) => n % 2 === 0; console.log(ePar(4)); // true console.log(ePar(7)); // false
Esse código utiliza o operador%
(módulo) para verificar se um número é divisível por 2. Se o resto da divisão for 0, o número é par; caso contrário, é ímpar. Esse tipo de lógica é muito útil para determinar comportamento alternado em loops ou validações específicas, como verificar em qual rodada um jogador deve atuar em um jogo.Curtiu esse código sobre números pares e ímpares? Então vamos testar ele clicando aqui!
Número primo
Agora, vamos verificar se um número é primo (divisível apenas por 1 e por ele mesmo).
const ePrimo = (n) => { if (n < 2) return false; for (let i = 2; i <= Math.sqrt(n); i++) { if (n % i === 0) return false; } return true; }; console.log(ePrimo(7)); // true console.log(ePrimo(10)); // false
Este código usa um loop otimizado, verificando até a raiz quadrada do número para economizar processamento. Números primos são fundamentais em criptografia e algoritmos de segurança, como em sistemas de chaves públicas.Quer se aprofundar mais no mundo dos números primos? Então bora testar este código aqui!
Soma dos dígitos
Vamos somar os dígitos de um número. Por exemplo, 123 vira 1 + 2 + 3 = 6.
const somaDigitos = (n) => { return n .toString() .split('') .reduce((acc, digito) => acc + parseInt(digito), 0); }; console.log(somaDigitos(123)); // 6
Este código converte o número para string, divide em dígitos e os soma utilizandoreduce
. A soma dos dígitos é frequentemente usada em validações, como o cálculo de checksums em códigos de barras e cartões de crédito.Ficou curioso para explorar mais sobre soma de dígitos? Teste o código aqui!
Anagrama
Um anagrama é uma palavra que pode ser formada reorganizando as letras de outra palavra. Vamos verificar isso!
const eAnagrama = (str1, str2) => { const ordenar = (str) => str.toLowerCase().split('').sort().join(''); return ordenar(str1) === ordenar(str2); }; console.log(eAnagrama('amor', 'roma')); // true console.log(eAnagrama('carro', 'barco')); // false
Aqui, ordenamos as letras das duas palavras e comparamos se são iguais. Esse tipo de lógica é aplicado em análise textual, como detecção de plágio e jogos de palavras.Gostou desse desafio sobre anagramas? Teste você mesmo aqui!
Sequência de collatz
A sequência de Collatz começa com um número e segue uma lógica: se o número for par, divida-o por 2; se for ímpar, multiplique por 3 e adicione 1. A sequência termina quando chega a 1.
const collatz = (n) => { let sequencia = [n]; while (n !== 1) { n = n % 2 === 0 ? n / 2 : n * 3 + 1; sequencia.push(n); } return sequencia; }; console.log(collatz(6)); // [6, 3, 10, 5, 16, 8, 4, 2, 1]
A sequência de Collatz é um enigma matemático fascinante que até hoje não foi resolvido para todos os números. Esse código é uma ótima forma de praticar manipulação de loops e listas.Acha que consegue dominar a sequência de Collatz? Experimente aqui!
Encontrar o maior elemento em um array
Um problema simples, mas muito útil.
const maiorElemento = (arr) => Math.max(...arr); console.log(maiorElemento([10, 20, 30, 50, 40])); // 50
Esse código usa o operador spread (...
) para aplicar o métodoMath.max
em todos os elementos do array. Isso é muito útil em algoritmos que precisam determinar pontuações máximas ou encontrar picos em séries temporais.Teste o código e descubra o maior elemento agora clicando aqui!
Soma dos N primeiros números naturais
Calcular a soma dos primeiros N números naturais pode ser feito de forma elegante com uma fórmula matemática.
const somaNaturais = (n) => (n * (n + 1)) / 2; console.log(somaNaturais(10)); // 55
Essa fórmula é uma forma eficiente de somar números consecutivos. É muito útil em situações como cálculos de progressão aritmética e otimizações matemáticas.Está pronto para dominar as somas naturais? Teste o código acessando aqui!
Busca binária
Vamos implementar uma busca binária, um dos algoritmos mais eficientes para encontrar um elemento em um array ordenado.
const buscaBinaria = (arr, alvo) => { let inicio = 0, fim = arr.length - 1; while (inicio <= fim) { let meio = Math.floor((inicio + fim) / 2); if (arr[meio] === alvo) return meio; else if (arr[meio] < alvo) inicio = meio + 1; else fim = meio - 1; } return -1; }; console.log(buscaBinaria([1, 3, 5, 7, 9], 7)); // 3
A busca binária reduz pela metade o espaço de busca a cada iteração, sendo extremamente eficiente em listas grandes. Ela é amplamente usada em algoritmos de busca e otimização.Explore o poder da busca binária e teste o código aqui!
Ordenação por inserção
Vamos finalizar com um algoritmo de ordenação: o Insertion Sort.
const insertionSort = (arr) => { for (let i = 1; i < arr.length; i++) { let atual = arr[i]; let j = i - 1; while (j >= 0 && arr[j] > atual) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = atual; } return arr; }; console.log(insertionSort([5, 3, 8, 6, 2])); // [2, 3, 5, 6, 8]
O Insertion Sort é um algoritmo simples, mas eficiente para pequenos conjuntos de dados. É frequentemente usado como parte de algoritmos híbridos, como o Timsort.Vamos ordenar e testar esse Insertion Sort? Experimente aqui!
Timsort?
O Timsort foi projetado para lidar bem com dados do mundo real, aproveitando sequências de dados já ordenados (chamadas de “natural runs”). Essas porções ordenadas são identificadas e tratadas individualmente, acelerando o processo de ordenação ao evitar retrabalho desnecessário.
A implementação é uma combinação dos algoritmos Merge Sort e Insertion Sort, equilibrando a estabilidade e a eficiência. Como um algoritmo estável, o Timsort mantém a ordem relativa de elementos de valor igual na coleção final, o que é importante em muitos cenários práticos.
Dicas para mandar bem em lógica de programação
- Divida o problema em partes menores: resolver o problema passo a passo facilita não só a compreensão, mas também evita sobrecarga mental. Cada pequena vitória conta!
- Depure o código: use o console do navegador e ferramentas como breakpoints para encontrar erros rapidamente e entender o comportamento do seu código em tempo real.
- Escreva pseudocódigos: antes de partir para a implementação, rascunhe a lógica no papel ou em um editor de texto. Isso ajuda a visualizar o problema sem a pressão da sintaxe correta.
- Pratique diariamente: a prática constante melhora sua lógica e desenvolve uma forma estruturada de pensar. Comece com pequenos desafios e vá aumentando a complexidade aos poucos.
- Faça parte de comunidades: aprender junto torna o processo mais divertido e eficiente. A Rocketseat tem uma comunidade incrível para trocar ideias, tirar dúvidas e celebrar conquistas!
- Compreenda diferentes abordagens: existem várias maneiras de resolver o mesmo problema. Explore métodos alternativos e veja o que funciona melhor em diferentes contextos.
- Use recursos visuais: diagramas e fluxogramas ajudam a visualizar a lógica do código. Ferramentas como o Draw.io são ótimas para esboçar o fluxo do programa.
- Teste com diferentes entradas: tente explorar os "cantos" do problema. Use inputs que você não pensaria inicialmente, como números negativos ou valores muito grandes.
Venha fazer parte da comunidade Rocketseat!
Aqui na Rocketseat, acreditamos que a jornada de aprendizado é mais empolgante e produtiva quando feita em comunidade. Nossa comunidade é composta por milhares de devs como você, prontos para trocar ideias, tirar dúvidas e celebrar cada conquista. E o melhor: você nunca estará sozinho! Quer discutir aquele bug desafiador ou compartilhar uma vitória com quem entende o que você está passando? A Rocketseat é o lugar certo para você.
Conclusão
Ufa! Que jornada incrível! Passamos por problemas clássicos de lógica e descobrimos juntos como o JavaScript pode ser uma ferramenta poderosa para resolver desafios de maneira elegante e eficiente. E aí, curtiu explorar essas soluções? Tenho certeza de que você já está enxergando a lógica com outros olhos e sentindo o gosto das primeiras conquistas!
Se você quer dar seus primeiros passos com ainda mais confiança, baixe agora o nosso Ebook de Lógica de Programação. Esse material foi criado especialmente para descomplicar conceitos que, no começo, podem parecer intimidadores. Ele é perfeito para quem está começando na programação e quer construir uma base sólida.
Agora que você já dominou alguns dos desafios mais clássicos, é hora de dar um passo além. Quer se aprofundar e dominar o JavaScript de verdade? Aperte os cintos e embarque no foguete da Rocketseat! Nossa formação Fullstack vai te guiar desde o básico até a criação de projetos reais, com direito a uma comunidade incrível e suporte personalizado para te acompanhar em cada etapa da jornada.
O céu não é o limite, é só o começo!
Então, dev, o que está esperando? Embarque na nossa formação Fullstack e dê o próximo grande passo na sua carreira! Vamos juntos construir o futuro, resolver desafios reais e transformar você em um desenvolvedor completo. Bora codar!