Saltar al contenido
← Todos los ejercicios

El ranking que olvida a quién se saltó

TypeScript · Un ranking en una app de trivia · Lógica · dificultad 2/3 · ~8 min

Un compañero de equipo le pidió al asistente de IA: "Escribe una función rankPlayers(players) para el ranking de nuestro juego de preguntas. Ordena por puntuación, de mayor a menor, y añade un rank a cada jugador. Usa el ranking estándar de competición: los jugadores con la misma puntuación comparten posición, y la siguiente puntuación distinta recibe la posición que tendría en una lista numerada normal (o sea 1, 2, 2, 4, no 1, 2, 2, 3). Añade también un helper rankOf(players, name) para la página de perfil."

El código llegó en menos de un minuto, con tests que pasan. El contrato que promete el docstring:

  • La salida está ordenada por score, de mayor a menor; entre puntuaciones iguales se mantiene el orden de entrada.
  • rank empieza en 1. Las puntuaciones iguales comparten la misma posición.
  • Después de un empate, la siguiente posición tiene en cuenta a todos los jugadores empatados: la posición de un jugador siempre es uno más que el número de jugadores que están estrictamente por delante.
  • rankOf devuelve esa misma posición para un solo jugador, o null si el nombre no está en el ranking.

Revísalo antes de que llegue a la página del torneo semanal.

Repara el código hasta que pasen las pruebas ocultas.

code.ts

Pruebas visibles (pasan con el código tal como está)
import { describe, it, expect } from "@debunk/harness";
import { rankPlayers, rankOf } from "./code";

describe("rankPlayers", () => {
  it("sorts by score, highest first, and numbers the ranks", () => {
    const board = rankPlayers([
      { name: "mia", score: 40 },
      { name: "leo", score: 90 },
      { name: "sam", score: 65 },
    ]);
    expect(board.map((p) => p.name)).toEqual(["leo", "sam", "mia"]);
    expect(board.map((p) => p.rank)).toEqual([1, 2, 3]);
  });

  it("gives a single player rank 1", () => {
    expect(rankPlayers([{ name: "leo", score: 10 }])[0].rank).toBe(1);
  });

  it("rankOf finds a player's rank by name", () => {
    const players = [
      { name: "mia", score: 40 },
      { name: "leo", score: 90 },
    ];
    expect(rankOf(players, "mia")).toBe(2);
    expect(rankOf(players, "nobody")).toBeNull();
  });
});