UNPKG

tiebreak

Version:

Calculation of chess tournament tiebreaks compliant with FIDE regulations

91 lines (90 loc) 3.69 kB
import { PlayerId, Results } from "./results.js"; export declare enum Tiebreak { /** * The overall score of the player, i.e. 1 point for each win and 0.5 points for each draw. */ SCORE = "SCORE", /** * The sum of the scores of each of the opponents of a participant. */ BUCHHOLZ = "BH", /** * Buchholz with the least significant opponent cut. Note that voluntarily * unplayed rounds will be cut first if FIDE_2023 regulations are applied. */ BUCHHOLZ_CUT1 = "BH-C1", BUCHHOLZ_CUT2 = "BH-C2", BUCHHOLZ_MEDIAN1 = "BH-M1", BUCHHOLZ_MEDIAN2 = "BH-M2" } export declare enum UnplayedRoundsAdjustment { /** * Any unplayed games are counted according to the points that were scored. * No "virtual opponents" are created when a player was not paired against * a real player. */ NONE = "NONE", /** * For the most part, the 2023 regulations treat unplayed rounds the same as played rounds, * e.g. Buchholz is usually just the sum of the opponent's score. However, opponent's who * withdrew from a tournament will have their score adjusted by counting all rounds after the * withdrawal as 0.5 points. In addition, the player's own unplayed rounds are counted as a * game against an opponent that scored the same number of points at the end of the tournament. */ FIDE_2023 = "FIDE_2023", /** * Adjustments according to FIDE regulations from 2009. If you had opponents who had * unplayed games, those unplayed games are always counted as a draw. If you had * unplayed games yourself, your Buchholz is calculated using a 'virtual opponent'. * The virtual opponent is assumed to have the same points as you initially and * score a draw in all following rounds. */ FIDE_2009 = "FIDE_2009" } export interface PlayerRanking { rank: number; playerId: PlayerId; scores: number[]; } /** * Calculates tiebreaks for a tournament with the given results and configuration. */ export declare class Tiebreaker { private results; private unplayedRoundsAdjustment; constructor(results: Results, unplayedRoundsAdjustment: UnplayedRoundsAdjustment); /** * Calculates a full ranking based on the given tiebreaks. The returned array is sorted * by rank. */ ranking(round: number, tiebreaks: Tiebreak[]): PlayerRanking[]; /** * Calculates the specified tiebreak. This is just a more generic short-hand method for calling * tiebreak methods directly. */ tiebreak(tiebreak: Tiebreak, player: PlayerId, round: number): number; /** * Returns the total points the given player scored by the given round. */ score(player: PlayerId, round: number): number; /** * Returns the players score with unplayed rounds adjusted according to the configured UnplayedRoundsAdjustment. */ adjustedScore(player: PlayerId, round: number): number; /** * Returns the highest round number in which the player was "available to play", i.e. they didn't * voluntarily not play the round. Returns 0 if the player was never available to play. */ private lastAvailableToPlayRound; /** * Returns all opponents of the given player with their adjusted scores for the purpose of * calculating tiebreaks like Buchholz and SoBerg. */ private adjustedGames; /** * Buchholz score. Note that unplayed games are adjusted according to the configured UnplayedRoundsAdjustment. */ buchholz(player: PlayerId, round: number, cutLowest?: number, cutHighest?: number): number; private scoreForResult; private sum; }