From c6014bd1b6ebaa3d982b80a07b19b007057c5911 Mon Sep 17 00:00:00 2001 From: 283375 Date: Mon, 18 Sep 2023 07:58:35 +0800 Subject: [PATCH] chore(calc): split `calculate` module --- src/arcaea_offline/calculate/__init__.py | 2 ++ src/arcaea_offline/calculate/b30.py | 24 +++++++++++++++++++ .../{calculate.py => calculate/score.py} | 23 ------------------ 3 files changed, 26 insertions(+), 23 deletions(-) create mode 100644 src/arcaea_offline/calculate/__init__.py create mode 100644 src/arcaea_offline/calculate/b30.py rename src/arcaea_offline/{calculate.py => calculate/score.py} (50%) diff --git a/src/arcaea_offline/calculate/__init__.py b/src/arcaea_offline/calculate/__init__.py new file mode 100644 index 0000000..29356f7 --- /dev/null +++ b/src/arcaea_offline/calculate/__init__.py @@ -0,0 +1,2 @@ +from .b30 import calculate_b30, get_b30_calculated_list +from .score import calculate_potential, calculate_score_range, calculate_shiny_pure diff --git a/src/arcaea_offline/calculate/b30.py b/src/arcaea_offline/calculate/b30.py new file mode 100644 index 0000000..3d640db --- /dev/null +++ b/src/arcaea_offline/calculate/b30.py @@ -0,0 +1,24 @@ +from decimal import Decimal +from typing import Dict, List + +from ..models.scores import ScoreCalculated + + +def get_b30_calculated_list( + calculated_list: List[ScoreCalculated], +) -> List[ScoreCalculated]: + best_scores: Dict[str, ScoreCalculated] = {} + for calculated in calculated_list: + key = f"{calculated.song_id}_{calculated.rating_class}" + stored = best_scores.get(key) + if stored and stored.score < calculated.score or not stored: + best_scores[key] = calculated + ret_list = list(best_scores.values()) + ret_list = sorted(ret_list, key=lambda c: c.potential, reverse=True)[:30] + return ret_list + + +def calculate_b30(calculated_list: List[ScoreCalculated]) -> Decimal: + ptt_list = [Decimal(c.potential) for c in get_b30_calculated_list(calculated_list)] + sum_ptt_list = sum(ptt_list) + return (sum_ptt_list / len(ptt_list)) if sum_ptt_list else Decimal("0.0") diff --git a/src/arcaea_offline/calculate.py b/src/arcaea_offline/calculate/score.py similarity index 50% rename from src/arcaea_offline/calculate.py rename to src/arcaea_offline/calculate/score.py index e02df0d..fd889bb 100644 --- a/src/arcaea_offline/calculate.py +++ b/src/arcaea_offline/calculate/score.py @@ -1,8 +1,5 @@ from decimal import Decimal from math import floor -from typing import Dict, List - -from .models.scores import ScoreCalculated def calculate_score_range(notes: int, pure: int, far: int): @@ -28,23 +25,3 @@ def calculate_shiny_pure(notes: int, score: int, pure: int, far: int) -> int: single_note_score = 10000000 / Decimal(notes) actual_score = single_note_score * pure + single_note_score * Decimal(0.5) * far return score - floor(actual_score) - - -def get_b30_calculated_list( - calculated_list: List[ScoreCalculated], -) -> List[ScoreCalculated]: - best_scores: Dict[str, ScoreCalculated] = {} - for calculated in calculated_list: - key = f"{calculated.song_id}_{calculated.rating_class}" - stored = best_scores.get(key) - if stored and stored.score < calculated.score or not stored: - best_scores[key] = calculated - ret_list = list(best_scores.values()) - ret_list = sorted(ret_list, key=lambda c: c.potential, reverse=True)[:30] - return ret_list - - -def calculate_b30(calculated_list: List[ScoreCalculated]) -> Decimal: - ptt_list = [Decimal(c.potential) for c in get_b30_calculated_list(calculated_list)] - sum_ptt_list = sum(ptt_list) - return (sum_ptt_list / len(ptt_list)) if sum_ptt_list else Decimal("0.0")