export interface RepetitionResult { player: number; bank: number; vPlayer: number; vBank: number; } export function round(number: number, decimals: number = 0): number { return Number(number.toFixed(decimals)); } export function p(player: number, odd1: number, exp: number): number { return player * Math.pow(odd1, exp); } export function calculateOutcome( player1: number, odd1: number, player2: number, refund: number = 0, ): number { return player1 * odd1 - player1 - player2 + refund; } export function counterPlayer( player: number, odd1: number, odd2: number, refund: number = 0, ): number { return round((player * odd1 - refund) / odd2, 0); } export function calculateRepetitions( player: number, refund: number, odd1: number, odd2: number, repetitions: number = 1, ): RepetitionResult[] { if (!integrityChecks(player, refund, odd1, odd2, repetitions)) return []; const result: RepetitionResult[] = []; let i = repetitions - 1; let tempPlayer = p(player, odd1, i); let oldPlayer: number; let tempBank = counterPlayer(tempPlayer, odd1, odd2, refund); result[i] = { player: tempPlayer, bank: tempBank, vPlayer: round(calculateOutcome(tempPlayer, odd1, tempBank), 2), vBank: round(calculateOutcome(tempBank, odd2, tempPlayer, refund), 2), }; for (i--; i >= 0; i--) { oldPlayer = tempPlayer; tempPlayer = round(p(player, odd1, i)); tempBank = round( (tempPlayer * odd1 + tempBank * odd2 - tempBank - oldPlayer) / odd2, 0, ); result[i] = { player: tempPlayer, bank: tempBank, vPlayer: round(calculateOutcome(tempPlayer, odd1, tempBank), 2), vBank: round(calculateOutcome(tempBank, odd2, tempPlayer, refund), 2), }; } return result; } export function calculateMinimumProfit(repArray: RepetitionResult[]): number { const n = repArray.length; const outcomes: number[] = []; let totalPlayer = 0; for (let i = 0; i < n; i++) { outcomes.push(totalPlayer + repArray[i].vBank); totalPlayer += repArray[i].vPlayer; } outcomes.push(totalPlayer); return Math.min(...outcomes); } export function integrityChecks( player: number, refund: number, odd1: number, odd2: number, repetitions: number, ): boolean { if ( isNaN(player) || isNaN(refund) || isNaN(odd1) || isNaN(odd2) || isNaN(repetitions) ) { return false; } if (player < 1 || refund < 0 || odd1 < 1 || odd2 < 1 || repetitions < 1) { return false; } return true; } export function calculateStake(percentage: number, value: number): number { return Math.ceil((100 * value) / percentage); }