Sari la conținut
← Toate exercițiile

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.
  • rankOf returnează același loc pentru un singur jucător sau null dacă 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();
  });
});