Source code for rstt.scheduler.tournament.snake

from typing import List, Dict

from rstt import Duel
from rstt.stypes import SPlayer
from . import Competition


[docs] class Snake(Competition): """The Snake Tournament This format is not a standard one. It is a model I detail and justify the interest in my master thesis and should be the subject of a paper in an hopefully near future. It does have some ressamblances with the `Ladder tournament <https://en.wikipedia.org/wiki/Ladder_tournament>`_. I am aware of two practical instances of uses: - The bonus round in the fencing challenge of the `modern pentathlon <https://en.wikipedia.org/wiki/Modern_pentathlon>`_ at the Paris Olympics 2024. - A cooking show with a `Hidden last chance <https://fr.wikipedia.org/wiki/Saison_14_de_Top_Chef>`_ secret tournament. Quick Overview: - For n participants it produces n-1 matches. - Every participants plays at least one match. - The final standing is an untied ranking. - Matches are all 'a priori balanced'. """ def __init__(self, *args, **kwars): super().__init__(*args, **kwars) self.snake = [] def _initialise(self) -> None: self.snake = [player for player in self.seeding] self.snake.reverse() def _update(self) -> None: self.snake.insert(0, self.played_matches[-1][0].winner()) def _end_of_stage(self) -> bool: return len(self.snake) == 1 def _standing(self) -> Dict[SPlayer, int]: standing = {games[0].loser(): len(self.participants())-r for r, games in enumerate(self.played_matches)} standing[self.played_matches[-1][0].winner()] = 1 return standing
[docs] def generate_games(self) -> List[Duel]: return [Duel(self.snake.pop(0), self.snake.pop(0))]