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: 計算結果