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. rankempieza 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.
rankOfdevuelve esa misma posición para un solo jugador, onullsi el nombre no está en el ranking.
Revísalo antes de que llegue a la página del torneo semanal.
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();
});
});