npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

tiebreak

v0.4.0

Published

Calculation of chess tournament tiebreaks compliant with FIDE regulations

Downloads

105

Readme

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
  • Buchholz with modifiers (Cut-1, Cut-2, Median-1 etc.)
  • Sonneborn-Berger
  • (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.

Release Notes

See https://github.com/marceljuenemann/tiebreak/releases

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
  • Push to main and ensure all workflows are passing
  • npm run build
  • npm publish
  • Create release on GitHub with release notes