Skip to content

Instantly share code, notes, and snippets.

@zisra
Last active October 23, 2023 01:19
Show Gist options
  • Save zisra/c3cbb281da4eda3e501c060b10e7bef7 to your computer and use it in GitHub Desktop.
Save zisra/c3cbb281da4eda3e501c060b10e7bef7 to your computer and use it in GitHub Desktop.
Calculate ELO
const K_FACTOR = 20;
const RATING_SCALING = 400;
interface Player {
isWin: boolean;
elo: number;
}
interface Result {
firstPlayer: Player;
secondPlayer: Player;
}
function calculateElo({ firstPlayer, secondPlayer }: Result): [number, number] {
const expectedOutcomeFirst = 1 / (1 + 10 ** ((secondPlayer.elo - firstPlayer.elo) / RATING_SCALING));
const expectedOutcomeSecond = 1 - expectedOutcomeFirst;
const actualOutcomeFirst = firstPlayer.isWin ? 1 : 0;
const actualOutcomeSecond = secondPlayer.isWin ? 1 : 0;
const newEloFirst = firstPlayer.elo + K_FACTOR * (actualOutcomeFirst - expectedOutcomeFirst);
const newEloSecond = secondPlayer.elo + K_FACTOR * (actualOutcomeSecond - expectedOutcomeSecond);
return [newEloFirst, newEloSecond];
}
function predictOutcome(firstPlayerElo: number, secondPlayerElo: number): [number, number] {
const expectedOutcomeFirst = 1 / (1 + 10 ** ((secondPlayerElo - firstPlayerElo) / RATING_SCALING));
const expectedOutcomeSecond = 1 - expectedOutcomeFirst;
return [expectedOutcomeFirst, expectedOutcomeSecond];
}
async function main() {
const firstPlayerScore = 1000
const secondPlayerScore = 1026;
const [newEloFirstPlayer, newEloSecondPlayer] = calculateElo({
firstPlayer: {
isWin: true,
elo: firstPlayerScore,
},
secondPlayer: {
isWin: false,
elo: secondPlayerScore,
},
});
console.log("Updated Elo Ratings:");
console.log(`First Player: ${newEloFirstPlayer}`);
console.log(`Second Player: ${newEloSecondPlayer}`);
const [expectedOutcomeFirst, expectedOutcomeSecond] = predictOutcome(newEloFirstPlayer, newEloSecondPlayer);
console.log("Expected Outcome:");
console.log(`First Player: ${expectedOutcomeFirst}`);
console.log(`Second Player: ${expectedOutcomeSecond}`);
}
main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment