Desafio JavaScript

Ranking de pontuações

Enunciado

Crie uma função ranking(pontos) que receba um array de números, devolva um novo array ordenado do maior para o menor (sem alterar o original) e remova pontuações duplicadas. Use slice para copiar, sort com comparador numérico, splice para remover duplicatas e includes para checar se o valor já apareceu.

Requisitos

  • Não modificar o array recebido (usar slice para copiar).
  • Ordenar em ordem decrescente com sort((a, b) => b - a).
  • Remover duplicatas usando splice e includes.
  • Retornar o novo array e imprimir o resultado para [50, 20, 50, 30, 20, 10].

Código inicial

function ranking(pontos) {
  // copie com slice, ordene e remova duplicatas
}

console.log(ranking([50, 20, 50, 30, 20, 10]));

Saída esperada

[ 50, 30, 20, 10 ]
Ver dica

Percorra o array ordenado de trás para frente; se o valor já apareceu antes (use includes num array auxiliar ou compare com o anterior), remova com splice(i, 1).

Mostrar solução
function ranking(pontos) {
  // 1) copia rasa: o array original fica intacto
  const ordenado = pontos.slice();

  // 2) ordena do maior para o menor (comparador numérico)
  ordenado.sort((a, b) => b - a);

  // 3) remove duplicatas percorrendo de trás para frente
  for (let i = ordenado.length - 1; i > 0; i--) {
    if (ordenado[i] === ordenado[i - 1]) {
      ordenado.splice(i, 1); // remove a posição i
    }
  }

  return ordenado;
}

const original = [50, 20, 50, 30, 20, 10];
console.log(ranking(original));
console.log(original); // confirma que não foi alterado

Passo a passo

  1. pontos.slice() cria uma cópia rasa do array recebido, garantindo que o original não seja modificado por sort e splice.
  2. ordenado.sort((a, b) => b - a) ordena em ordem decrescente; sem o comparador, o sort trataria os números como strings e [50, 20, 30, 10] sairia errado.
  3. O for começa no último índice e vai até 1, comparando cada elemento com o anterior.
  4. Quando dois vizinhos são iguais, ordenado.splice(i, 1) remove o da posição i.
  5. Percorrer de trás para frente evita pular elementos: ao remover o índice i, os índices menores continuam válidos.
  6. No final, return ordenado entrega o novo array.
  7. O console.log(original) comprova que o array de entrada segue com os seis valores.

Por que funciona

Como a lista já está ordenada, valores duplicados ficam sempre lado a lado, então basta comparar cada item com o anterior. slice garante imutabilidade, sort com comparador garante ordem numérica correta e splice remove exatamente uma posição por vez.

Erros comuns

  • Fazer const ordenado = pontos em vez de pontos.slice(): os dois nomes apontam para o mesmo array, e sort/splice acabam alterando o original.
  • Usar ordenado.sort() sem comparador: o resultado vira ordem lexicográfica, [ 50, 30, 20, 10 ] ainda parece certo nesse caso, mas com [100, 9] sairia [ 100, 9 ].
  • Percorrer de frente para trás com splice: ao remover o índice i, o próximo elemento é pulado.

Outra forma de resolver

Usar Set para remover duplicatas: return [...new Set(pontos)].sort((a, b) => b - a);. É mais curto e idiomático quando não é obrigatório usar splice.

Saída esperada

[ 50, 30, 20, 10 ]
[ 50, 20, 50, 30, 20, 10 ]