Clasamentul care uită pe cine a sărit
TypeScript · Un clasament într-o aplicație de quiz · Logică · dificultate 2/3 · ~8 min
Un coleg i-a cerut asistentului AI: „Scrie o funcție rankPlayers(players) pentru clasamentul quiz-ului nostru. Sortează după scor, de la cel mai mare, și atașează fiecărui jucător un rank. Folosește clasamentul standard de competiție: jucătorii cu același scor împart locul, iar următorul scor distinct primește locul pe care l-ar avea într-o listă numerotată simplă (deci 1, 2, 2, 4, nu 1, 2, 2, 3). Adaugă și un helper rankOf(players, name) pentru pagina de profil.”
Codul a venit în mai puțin de un minut, cu teste care trec. Contractul promis de docstring:
- Rezultatul e sortat după
score, de la cel mai mare; între scorurile egale se păstrează ordinea din input. rankîncepe de la 1. Scorurile egale împart același loc.- După o egalitate, următorul loc ține cont de toți jucătorii la egalitate: locul unui jucător e mereu cu unu mai mare decât numărul de jucători aflați strict înaintea lui.
rankOfreturnează același loc pentru un singur jucător saunulldacă numele nu e în clasament.
Fă-i review înainte să ajungă pe pagina turneului săptămânal.
Repară codul până trec testele ascunse.
code.ts
Teste vizibile (trec pe codul primit)
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();
});
});