src/utils/calculatorFunctions.ts (view raw)
1export interface RepetitionResult {
2 player: number;
3 bank: number;
4 vPlayer: number;
5 vBank: number;
6}
7
8export function round(number: number, decimals: number = 0): number {
9 return Number(number.toFixed(decimals));
10}
11
12export function p(player: number, odd1: number, exp: number): number {
13 return player * Math.pow(odd1, exp);
14}
15
16export function calculateOutcome(
17 player1: number,
18 odd1: number,
19 player2: number,
20 refund: number = 0,
21): number {
22 return player1 * odd1 - player1 - player2 + refund;
23}
24
25export function counterPlayer(
26 player: number,
27 odd1: number,
28 odd2: number,
29 refund: number = 0,
30): number {
31 return round((player * odd1 - refund) / odd2, 0);
32}
33
34export function calculateRepetitions(
35 player: number,
36 refund: number,
37 odd1: number,
38 odd2: number,
39 repetitions: number = 1,
40): RepetitionResult[] {
41 if (!integrityChecks(player, refund, odd1, odd2, repetitions)) return [];
42
43 const result: RepetitionResult[] = [];
44 let i = repetitions - 1;
45 let tempPlayer = p(player, odd1, i);
46 let oldPlayer: number;
47 let tempBank = counterPlayer(tempPlayer, odd1, odd2, refund);
48
49 result[i] = {
50 player: tempPlayer,
51 bank: tempBank,
52 vPlayer: round(calculateOutcome(tempPlayer, odd1, tempBank), 2),
53 vBank: round(calculateOutcome(tempBank, odd2, tempPlayer, refund), 2),
54 };
55
56 for (i--; i >= 0; i--) {
57 oldPlayer = tempPlayer;
58
59 tempPlayer = round(p(player, odd1, i));
60 tempBank = round(
61 (tempPlayer * odd1 + tempBank * odd2 - tempBank - oldPlayer) / odd2,
62 0,
63 );
64
65 result[i] = {
66 player: tempPlayer,
67 bank: tempBank,
68 vPlayer: round(calculateOutcome(tempPlayer, odd1, tempBank), 2),
69 vBank: round(calculateOutcome(tempBank, odd2, tempPlayer, refund), 2),
70 };
71 }
72 return result;
73}
74
75export function calculateMinimumProfit(repArray: RepetitionResult[]): number {
76 const n = repArray.length;
77 const outcomes: number[] = [];
78
79 let totalPlayer = 0;
80
81 for (let i = 0; i < n; i++) {
82 outcomes.push(totalPlayer + repArray[i].vBank);
83 totalPlayer += repArray[i].vPlayer;
84 }
85 outcomes.push(totalPlayer);
86
87 return Math.min(...outcomes);
88}
89
90export function integrityChecks(
91 player: number,
92 refund: number,
93 odd1: number,
94 odd2: number,
95 repetitions: number,
96): boolean {
97 if (
98 isNaN(player) ||
99 isNaN(refund) ||
100 isNaN(odd1) ||
101 isNaN(odd2) ||
102 isNaN(repetitions)
103 ) {
104 return false;
105 }
106
107 if (player < 1 || refund < 0 || odd1 < 1 || odd2 < 1 || repetitions < 1) {
108 return false;
109 }
110 return true;
111}
112
113export function calculateStake(percentage: number, value: number): number {
114 return Math.ceil((100 * value) / percentage);
115}