def start_analyze(cls) -> Msg: """解析開始メッセージ生成 Returns: Msg: メッセージ """ return Msg(MsgType.INFO, cls._get_msg(MsgCode.FUNC_START).format(funcName="数独の解析"))
def error_info(cls, num: int) -> Msg: """解析中エラーメッセージ生成 Args: num (int): エラー数 Returns: Msg: メッセージ """ return Msg(MsgType.ERROR, cls._get_msg(MsgCode.ERROR_INFO).format(num=num))
def unfixed_num(cls, cnt: int) -> Msg: """確定数通知メッセージ生成 Args: cnt (int): 確定枡数 Returns: Msg: メッセージ """ return Msg(MsgType.INFO, cls._get_msg(MsgCode.UNFIXED_SQU_NUM).format(cnt=cnt))
def not_enough_hints(cls, min) -> Msg: """ヒント数不足メッセージ生成 Args: min (Square): 最小ヒント数 Returns: Msg: メッセージ """ return Msg(MsgType.ERROR, cls._get_msg(MsgCode.NOT_ENOUGH_HINTS).format(min=min))
def how_to_elimionation_one_memo(cls, how_anlz: HowToAnalyze) -> Msg: """消去法(メモがひとつしかない)メッセージ生成 Args: how_anlz (HowToAnalyze): 解析方法 Returns: Msg: メッセージ """ return Msg( MsgType.SUCCESS, cls._get_msg(MsgCode.HOW_TO_ELIMIONATION_ONE_MEMO).format( changedSqu=SudokuUtil.cnv_squ_to_text(how_anlz.changed_squ), commitVal=how_anlz.commit_val))
def howto_summary(cls, idx: int, method: Method, cnt: int) -> Msg: """解析方法サマリメッセージ生成 Args: cnt (int): 確定枡数 Returns: Msg: メッセージ """ return Msg( MsgType.INFO, cls._get_msg(MsgCode.HOW_TO_SUMMARY).format( idx=idx, method=SudokuUtil.cnv_method_to_text(method), cnt=cnt))
def not_exist_num_clm(cls, num: int, region_pos: int) -> Msg: """列に数字がないメッセージ生成 Args: num (int): 数字 region_pos (int): ポジション Returns: Msg: メッセージ """ return Msg( MsgType.ERROR, cls._get_msg(MsgCode.NOT_EXIST_NUM_CLM).format( num=num, regionPos=region_pos))
def not_exist_num_area(cls, num: int, squ: Square) -> Msg: """エリアに数字がないメッセージ生成 Args: num (int): 数字 squ (Square): 枡 Returns: Msg: メッセージ """ return Msg( MsgType.ERROR, cls._get_msg(MsgCode.NOT_EXIST_NUM_AREA).format( num=num, squ=SudokuUtil.cnv_squ_to_text(squ)))
def dup_row(cls, pivot_squ: Square, compare_squ: Square) -> Msg: """行重複メッセージ生成 Args: pivot_squ (Square): 基準枡 compare_squ (Square): 比較枡 Returns: Msg: メッセージ """ return Msg( MsgType.ERROR, cls._get_msg(MsgCode.DUP_ROW).format( val=pivot_squ.get_fixed_val(), pivotSqu=SudokuUtil.cnv_squ_to_text(pivot_squ), compareSqu=SudokuUtil.cnv_squ_to_text(compare_squ)))
def how_to_simple_chain(cls, how_anlz: HowToAnalyze) -> Msg: """シンプルチェーン法メッセージ生成 Args: how_anlz (HowToAnalyze): 解析方法 Returns: Msg: メッセージ """ return Msg( MsgType.INFO, cls._get_msg(MsgCode.HOW_TO_SIMPLE_CHAIN).format( changedSqu=SudokuUtil.cnv_squ_to_text(how_anlz.changed_squ), chainSquList=SudokuUtil.cnv_squ_list_to_text( how_anlz.chain_squ_list), removeMemo=how_anlz.remove_memo_list[0]))
def how_to_elimionation(cls, how_anlz: HowToAnalyze) -> Msg: """消去法(メモ削除)メッセージ生成 Args: how_anlz (HowToAnalyze): 解析方法 Returns: Msg: メッセージ """ return Msg( MsgType.INFO, cls._get_msg(MsgCode.HOW_TO_ELIMIONATION).format( changedSqu=SudokuUtil.cnv_squ_to_text(how_anlz.changed_squ), region=SudokuUtil.cnv_region_to_text(how_anlz.region), triggerSqu=SudokuUtil.cnv_squ_to_text( how_anlz.trigger_squ_list[0]), removeMemo=how_anlz.remove_memo_list[0]))
def how_to_locked_candidates(cls, how_anlz: HowToAnalyze) -> Msg: """ロックされた候補法メッセージ生成 Args: how_anlz (HowToAnalyze): 解析方法 Returns: Msg: メッセージ """ return Msg( MsgType.INFO, cls._get_msg(MsgCode.HOW_TO_LOCKED_CANDIDATES).format( changedSqu=SudokuUtil.cnv_squ_to_text(how_anlz.changed_squ), triggerSqu=SudokuUtil.cnv_squ_to_text( how_anlz.trigger_squ_list[0]), removeMemo=how_anlz.remove_memo_list[0], regionPos=how_anlz.trigger_squ_list[0].row if how_anlz.region == Region.ROW else how_anlz.trigger_squ_list[0].clm, region=SudokuUtil.cnv_region_to_text(how_anlz.region)))
def how_to_hidden_pair(cls, how_anlz: HowToAnalyze, pair_list: List[int]) -> Msg: """隠れペア法メッセージ生成 Args: how_anlz (HowToAnalyze): 解析方法 pair_list (List[int]): ペアリスト Returns: Msg: メッセージ """ return Msg( MsgType.INFO, cls._get_msg(MsgCode.HOW_TO_HIDDEN_PAIR).format( changedSqu=SudokuUtil.cnv_squ_to_text(how_anlz.changed_squ), region=SudokuUtil.cnv_region_to_text(how_anlz.region), triggerSquList=SudokuUtil.cnv_squ_list_to_text( how_anlz.trigger_squ_list), pairList=SudokuUtil.cnv_memo_list_to_text(pair_list), removeMemo=how_anlz.remove_memo_list[0]))
def how_to_x_wing(cls, how_anlz: HowToAnalyze, region_pair: Tuple[int, int]) -> Msg: """X-Wing法メッセージ生成 Args: how_anlz (HowToAnalyze): 解析方法 region_pair (Tuple[int, int]): 方向位置 Returns: Msg: メッセージ """ # regionPos1、regionPos2を算出 pos_set: Set[int] = set() for squ in how_anlz.trigger_squ_list: if how_anlz.region == Region.ROW: pos_set.add(squ.row) else: pos_set.add(squ.clm) pos_list: List[int] = list(pos_set) pos_list.sort() return Msg( MsgType.INFO, cls._get_msg(MsgCode.HOW_TO_X_WING).format( changedSqu=SudokuUtil.cnv_squ_to_text(how_anlz.changed_squ), removeMemo=how_anlz.remove_memo_list[0], regionPos1=pos_list[0], regionPos2=pos_list[1], region=SudokuUtil.cnv_region_to_text(how_anlz.region), triggerSqu1=SudokuUtil.cnv_squ_to_text( how_anlz.trigger_squ_list[0]), triggerSqu2=SudokuUtil.cnv_squ_to_text( how_anlz.trigger_squ_list[1]), triggerSqu3=SudokuUtil.cnv_squ_to_text( how_anlz.trigger_squ_list[2]), triggerSqu4=SudokuUtil.cnv_squ_to_text( how_anlz.trigger_squ_list[3])))