1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
from typing import Dict, List, Tuple
import math
class Player:
def __init__(self, name: str, initial_rating: int = 1500):
self.name = name
self.rating = initial_rating
self.games_played = 0
self.rating_history = [initial_rating]
def get_k_factor(self) -> int:
if self.games_played < 30:
return 40 # New players
elif self.rating < 2100:
return 20 # Regular players
else:
return 10 # Expert players
def update_rating(self, new_rating: int) -> None:
self.rating = max(100, min(3000, new_rating)) # Clamp between 100-3000
self.games_played += 1
self.rating_history.append(self.rating)
class TournamentEloSystem:
def __init__(self):
self.players: Dict[str, Player] = {}
def add_player(self, name: str, initial_rating: int = 1500) -> None:
self.players[name] = Player(name, initial_rating)
def record_game(self, player_a: str, player_b: str, result: int) -> None:
if player_a not in self.players or player_b not in self.players:
return # Player not found
p_a = self.players[player_a]
p_b = self.players[player_b]
# Use average K-factor for the game
k_factor = (p_a.get_k_factor() + p_b.get_k_factor()) / 2.0
# Calculate expected scores
expected_a = 1.0 / (1.0 + math.pow(10.0, (p_b.rating - p_a.rating) / 400.0))
expected_b = 1.0 - expected_a
# Determine actual scores
if result == 1: # A wins
actual_a, actual_b = 1.0, 0.0
elif result == -1: # B wins
actual_a, actual_b = 0.0, 1.0
else: # Draw
actual_a, actual_b = 0.5, 0.5
# Calculate and apply rating changes
change_a = round(k_factor * (actual_a - expected_a))
change_b = round(k_factor * (actual_b - expected_b))
p_a.update_rating(p_a.rating + change_a)
p_b.update_rating(p_b.rating + change_b)
def get_player_rating(self, name: str) -> int:
return self.players[name].rating if name in self.players else -1
def get_leaderboard(self) -> List[Tuple[str, int]]:
return sorted([(p.name, p.rating) for p in self.players.values()],
key=lambda x: x[1], reverse=True)
class Solution:
def process_game_advanced(self, player_a: str, player_b: str,
rating_a: int, rating_b: int, result: int) -> Tuple[int, int]:
tournament = TournamentEloSystem()
tournament.add_player(player_a, rating_a)
tournament.add_player(player_b, rating_b)
tournament.record_game(player_a, player_b, result)
return tournament.get_player_rating(player_a), tournament.get_player_rating(player_b)
|