55from ttt .entities .elo .rating import EloRating
66
77
8- type RankTier = Literal [- 1 , 0 , 1 , 2 , 3 , 4 ]
8+ type RankTier = Literal [- 1 , 0 , 1 , 2 , 3 , 4 , 5 ]
99
1010
1111@dataclass (frozen = True )
12- class Rank :
12+ class IntervalRank :
1313 tier : RankTier
1414 min_rating : EloRating
1515 max_rating : EloRating
1616
1717
18+ @dataclass (frozen = True )
19+ class SpecialRank [TierT : RankTier , NameT : str ]:
20+ tier : TierT
21+ name : NameT
22+
23+
24+ StrongestRank = SpecialRank [Literal [5 ], Literal ["strongest" ]]
25+ strongest_rank = StrongestRank (tier = 5 , name = "strongest" )
26+
27+ special_ranks = (
28+ strongest_rank ,
29+ )
30+
31+
32+ type Rank = IntervalRank | StrongestRank
33+
34+
35+ interval_ranks = (
36+ IntervalRank (tier = - 1 , min_rating = - math .inf , max_rating = 871 ),
37+ IntervalRank (tier = 0 , min_rating = 872 , max_rating = 1085 ),
38+ IntervalRank (tier = 1 , min_rating = 1086 , max_rating = 1336 ),
39+ IntervalRank (tier = 2 , min_rating = 1337 , max_rating = 1679 ),
40+ IntervalRank (tier = 3 , min_rating = 1680 , max_rating = 1999 ),
41+ IntervalRank (tier = 4 , min_rating = 2000 , max_rating = math .inf ),
42+ )
43+
44+
1845ranks = (
19- Rank (tier = - 1 , min_rating = - math .inf , max_rating = 871 ),
20- Rank (tier = 0 , min_rating = 872 , max_rating = 1085 ),
21- Rank (tier = 1 , min_rating = 1086 , max_rating = 1336 ),
22- Rank (tier = 2 , min_rating = 1337 , max_rating = 1679 ),
23- Rank (tier = 3 , min_rating = 1680 , max_rating = 1999 ),
24- Rank (tier = 4 , min_rating = 2000 , max_rating = math .inf ),
46+ * interval_ranks ,
47+ * special_ranks ,
2548)
2649
2750
@@ -33,8 +56,18 @@ def rank_with_tier(tier: RankTier) -> Rank:
3356 raise ValueError
3457
3558
36- def rank_for_rating (rating : EloRating ) -> Rank :
37- for rank in ranks :
59+ type UsersWithMaxRating = Literal ["1" , ">1" ]
60+
61+
62+ def rank (
63+ rating : EloRating ,
64+ max_rating : EloRating ,
65+ users_with_max_rating : UsersWithMaxRating ,
66+ ) -> Rank :
67+ if rating == max_rating and users_with_max_rating == "1" :
68+ return strongest_rank
69+
70+ for rank in interval_ranks :
3871 if rank .min_rating <= rating <= rank .max_rating :
3972 return rank
4073
0 commit comments