libs.functions.score
libs/functions/score.py
1""" 2libs/functions/score.py 3""" 4 5import logging 6import re 7 8import pandas as pd 9 10import libs.global_value as g 11 12 13def point_split(point: list) -> list: 14 """順位点を山分けする 15 16 Args: 17 point (list): 山分けするポイントのリスト 18 19 Returns: 20 list: 山分けした結果 21 """ 22 23 new_point = [int(sum(point) / len(point))] * len(point) 24 if sum(point) % len(point): 25 new_point[0] += sum(point) % len(point) 26 if sum(point) < 0: 27 new_point = list(map(lambda x: x - 1, new_point)) 28 29 return new_point 30 31 32def calculation_point(score_list: list[str]) -> dict: 33 """獲得ポイントと順位を計算する 34 35 Args: 36 score_list (list[str]): 素点リスト 37 38 Returns: 39 dict: 更新用辞書(順位と獲得ポイントのデータ) 40 """ 41 42 # 計算用データフレーム 43 score_df = pd.DataFrame( 44 {"rpoint": [normalized_expression(x) for x in score_list]}, 45 index=["p1", "p2", "p3", "p4"] 46 ) 47 48 # 順位点算出 49 rank_point = g.cfg.mahjong.rank_point.copy() # ウマ 50 rank_point[0] += int((g.cfg.mahjong.return_point - g.cfg.mahjong.origin_point) / 10 * 4) # オカ 51 52 if g.cfg.mahjong.draw_split: # 山分け 53 score_df["rank"] = score_df["rpoint"].rank( 54 ascending=False, method="min" 55 ).astype("int") 56 57 # 順位点リストの更新 58 rank_sequence = "".join( 59 score_df["rank"].sort_values().to_string(index=False).split() 60 ) 61 match rank_sequence: 62 case "1111": 63 rank_point = point_split(rank_point) 64 case "1114": 65 new_point = point_split(rank_point[0:3]) 66 rank_point[0] = new_point[0] 67 rank_point[1] = new_point[1] 68 rank_point[2] = new_point[2] 69 case "1134": 70 new_point = point_split(rank_point[0:2]) 71 rank_point[0] = new_point[0] 72 rank_point[1] = new_point[1] 73 case "1133": 74 new_point = point_split(rank_point[0:2]) 75 rank_point[0] = new_point[0] 76 rank_point[1] = new_point[1] 77 new_point = point_split(rank_point[2:4]) 78 rank_point[2] = new_point[0] 79 rank_point[3] = new_point[1] 80 case "1222": 81 new_point = point_split(rank_point[1:4]) 82 rank_point[1] = new_point[0] 83 rank_point[2] = new_point[1] 84 rank_point[3] = new_point[2] 85 case "1224": 86 new_point = point_split(rank_point[1:3]) 87 rank_point[1] = new_point[0] 88 rank_point[2] = new_point[1] 89 case "1233": 90 new_point = point_split(rank_point[2:4]) 91 rank_point[2] = new_point[0] 92 rank_point[3] = new_point[1] 93 case _: 94 pass 95 96 else: # 席順 97 score_df["rank"] = score_df["rpoint"].rank( 98 ascending=False, method="first" 99 ).astype("int") 100 101 logging.trace("rank_point=%s", rank_point) # type: ignore 102 103 # 獲得ポイントの計算 (素点-配給原点)/10+順位点 104 score_df["position"] = score_df["rpoint"].rank( # 加算する順位点リストの位置 105 ascending=False, method="first" 106 ).astype("int") 107 score_df["point"] = (score_df["rpoint"] - g.cfg.mahjong.return_point) / 10 + score_df["position"].apply(lambda p: rank_point[p - 1]) 108 score_df["point"] = score_df["point"].apply(lambda p: float(f"{p:.1f}")) # 桁ブレ修正 109 110 # 返却値用辞書 111 ret_dict = {f"{k}_{x}": v for x in score_df.columns for k, v in score_df[x].to_dict().items()} 112 ret_dict.update(deposit=int(g.cfg.mahjong.origin_point * 4 - score_df["rpoint"].sum())) 113 114 return ret_dict 115 116 117def normalized_expression(expr: str) -> int: 118 """入力文字列を式として評価し、計算結果を返す 119 120 Args: 121 expr (str): 入力式 122 123 Returns: 124 int: 計算結果 125 """ 126 127 normalized: list = [] 128 129 for token in re.findall(r"\d+|[+\-*/]", expr): 130 if isinstance(token, str): 131 if token.isnumeric(): 132 normalized.append(str(int(token))) 133 else: 134 normalized.append(token) 135 136 return eval("".join(normalized)) # pylint: disable=eval-used
def
point_split(point: list) -> list:
14def point_split(point: list) -> list: 15 """順位点を山分けする 16 17 Args: 18 point (list): 山分けするポイントのリスト 19 20 Returns: 21 list: 山分けした結果 22 """ 23 24 new_point = [int(sum(point) / len(point))] * len(point) 25 if sum(point) % len(point): 26 new_point[0] += sum(point) % len(point) 27 if sum(point) < 0: 28 new_point = list(map(lambda x: x - 1, new_point)) 29 30 return new_point
順位点を山分けする
Arguments:
- point (list): 山分けするポイントのリスト
Returns:
list: 山分けした結果
def
calculation_point(score_list: list[str]) -> dict:
33def calculation_point(score_list: list[str]) -> dict: 34 """獲得ポイントと順位を計算する 35 36 Args: 37 score_list (list[str]): 素点リスト 38 39 Returns: 40 dict: 更新用辞書(順位と獲得ポイントのデータ) 41 """ 42 43 # 計算用データフレーム 44 score_df = pd.DataFrame( 45 {"rpoint": [normalized_expression(x) for x in score_list]}, 46 index=["p1", "p2", "p3", "p4"] 47 ) 48 49 # 順位点算出 50 rank_point = g.cfg.mahjong.rank_point.copy() # ウマ 51 rank_point[0] += int((g.cfg.mahjong.return_point - g.cfg.mahjong.origin_point) / 10 * 4) # オカ 52 53 if g.cfg.mahjong.draw_split: # 山分け 54 score_df["rank"] = score_df["rpoint"].rank( 55 ascending=False, method="min" 56 ).astype("int") 57 58 # 順位点リストの更新 59 rank_sequence = "".join( 60 score_df["rank"].sort_values().to_string(index=False).split() 61 ) 62 match rank_sequence: 63 case "1111": 64 rank_point = point_split(rank_point) 65 case "1114": 66 new_point = point_split(rank_point[0:3]) 67 rank_point[0] = new_point[0] 68 rank_point[1] = new_point[1] 69 rank_point[2] = new_point[2] 70 case "1134": 71 new_point = point_split(rank_point[0:2]) 72 rank_point[0] = new_point[0] 73 rank_point[1] = new_point[1] 74 case "1133": 75 new_point = point_split(rank_point[0:2]) 76 rank_point[0] = new_point[0] 77 rank_point[1] = new_point[1] 78 new_point = point_split(rank_point[2:4]) 79 rank_point[2] = new_point[0] 80 rank_point[3] = new_point[1] 81 case "1222": 82 new_point = point_split(rank_point[1:4]) 83 rank_point[1] = new_point[0] 84 rank_point[2] = new_point[1] 85 rank_point[3] = new_point[2] 86 case "1224": 87 new_point = point_split(rank_point[1:3]) 88 rank_point[1] = new_point[0] 89 rank_point[2] = new_point[1] 90 case "1233": 91 new_point = point_split(rank_point[2:4]) 92 rank_point[2] = new_point[0] 93 rank_point[3] = new_point[1] 94 case _: 95 pass 96 97 else: # 席順 98 score_df["rank"] = score_df["rpoint"].rank( 99 ascending=False, method="first" 100 ).astype("int") 101 102 logging.trace("rank_point=%s", rank_point) # type: ignore 103 104 # 獲得ポイントの計算 (素点-配給原点)/10+順位点 105 score_df["position"] = score_df["rpoint"].rank( # 加算する順位点リストの位置 106 ascending=False, method="first" 107 ).astype("int") 108 score_df["point"] = (score_df["rpoint"] - g.cfg.mahjong.return_point) / 10 + score_df["position"].apply(lambda p: rank_point[p - 1]) 109 score_df["point"] = score_df["point"].apply(lambda p: float(f"{p:.1f}")) # 桁ブレ修正 110 111 # 返却値用辞書 112 ret_dict = {f"{k}_{x}": v for x in score_df.columns for k, v in score_df[x].to_dict().items()} 113 ret_dict.update(deposit=int(g.cfg.mahjong.origin_point * 4 - score_df["rpoint"].sum())) 114 115 return ret_dict
獲得ポイントと順位を計算する
Arguments:
- score_list (list[str]): 素点リスト
Returns:
dict: 更新用辞書(順位と獲得ポイントのデータ)
def
normalized_expression(expr: str) -> int:
118def normalized_expression(expr: str) -> int: 119 """入力文字列を式として評価し、計算結果を返す 120 121 Args: 122 expr (str): 入力式 123 124 Returns: 125 int: 計算結果 126 """ 127 128 normalized: list = [] 129 130 for token in re.findall(r"\d+|[+\-*/]", expr): 131 if isinstance(token, str): 132 if token.isnumeric(): 133 normalized.append(str(int(token))) 134 else: 135 normalized.append(token) 136 137 return eval("".join(normalized)) # pylint: disable=eval-used
入力文字列を式として評価し、計算結果を返す
Arguments:
- expr (str): 入力式
Returns:
int: 計算結果