tiebreak

v0.3.0
Calculation of chess tournament tiebreaks compliant with FIDE regulations
chess fide tiebreak tiebreaker ranking buchholz

Tiebreak: FIDE compliant tournament tiebreak calculation

NPM NPM GitHub Workflow Status

Tiebreak is a TypeScript library for calculating various tournament tiebreak scores. The focus lies on chess tournaments and implementing the algorithms specified by FIDE, the world chess organization.

Features

Calculation of the following tiebreakers:

  • Buchholz
  • (more to come!)

Configurable adjustments for unplayed games:

  • FIDE regulations from 2023 ("dummy opponent")
  • FIDE regulations from 2009 ("virtual opponent")
  • No adjustment for unplayed games

Built in calculation of entire tournament rankings

Note: Only individual Swiss tournaments are currently supported. Team tournaments and round robin tournaments are not implemented correctly yet.

Installation

npm install --save tiebreak

Usage

First, you need to create a Results object with all relevant pairing information. You can use an arbitrary string or number to identify players.

import { Results, TournamentType } from "tiebreak"

const results = new Results(TournamentType.SWISS, [
  {
    // Example round 1: Player D did not show up
    pairings: [
      { white: "C", black: "A", scoreWhite: 0.5, scoreBlack: 0.5, forfeited: false },
      { white: "B", black: "D", scoreWhite: 1, scoreBlack: 0, forfeited: true },
    ],
  },
  {
    // Example round 2: Player D was not paired, player C received a bye
    pairings: [{ white: "A", black: "B", scoreWhite: 0, scoreBlack: 1, forfeited: false }],
    pairingAllocatedByes: ["C"],
  },
])

You can now calculate a specific tiebreak score for a given player and round like this:

const tiebreaker = new Tiebreaker(results, UnplayedRoundsAdjustment.FIDE_2023)
console.log(tiebreaker.buchholz("A", 2))
// Output: 3.5

Or you can just calculate an entire ranking with multiple tiebreakers:

console.log(tiebreaker.ranking(2, [Tiebreak.SCORE, Tiebreak.BUCHHOLZ]))
/*
  Output:
  [
    { rank: 1, playerId: "B", scores: [2, 2.5] },
    { rank: 2, playerId: "C", scores: [1.5, 2] },
    { rank: 3, playerId: "A", scores: [0.5, 3.5] },
    { rank: 4, playerId: "D", scores: [0, 0] },
  ]
*/

Project Goals

  • FIDE compliant: Stay up-to-date with the FIDE Tie-Break Regulations as specified in the FIDE Handbook section C 07
  • Backwards compatible: It should be possible to run calculations according to old versions of the FIDE Regulations and old versions of this library. Updates of this library should not automatically lead to new calculations, unless the new algorithm is selected. This is also important for calculating tie breaks of past tournaments. Note: Alpha versions of this library (0.x) do not guarantee backwards compatibility
  • Readable code: The code is optimized for being readable and easy to understand. Reduction of code duplication and speed of execution are only minor goals.
  • Extensively tested: The code should be extensively covered by unit tests.
  • Opinionated: The library does not try to implement every possible tie break with every possible configuration. Instead, the focus lies on implementing tie breaks and configurations that make the most sense to use in real tournaments.

Development

  • Build: npm run build
  • Unit tests: npm run test or npm run test:watch
  • Unit test coverage: npm run test:coverage (Not working yet?)
  • Format code: npm run format
  • Lint: npm run lint
  • Spell check: npm run spell:check

Deployment procedure:

  • Increase version
  • Update CHANGELOG (or create it)
  • Push to main and ensure all workflows are passing
  • npm run build
  • npm publish
npm i tiebreak

Metadata

  • MIT
  • >=18.15.0
  • Marcel Juenemann
  • released 10/16/2024

Downloads

Maintainers