132 lines
4.4 KiB
Python
132 lines
4.4 KiB
Python
|
|
# 号码分类工具
|
|||
|
|
# 按MEMORY.md最新规则 (2026-04-02)
|
|||
|
|
# 优先级:数字越小越有价值
|
|||
|
|
|
|||
|
|
CATEGORIES = [
|
|||
|
|
# 1. 圆圆号:无.123457,只能用0689
|
|||
|
|
{"name": "圆圆号", "cannot_use": ".123457", "must_have": ""},
|
|||
|
|
# 2. 倒置号:无23457,可用01689必须有1
|
|||
|
|
{"name": "倒置号", "cannot_use": "23457", "must_have": "1"},
|
|||
|
|
# 3. 金马王:无12347,可用05689必须有5
|
|||
|
|
{"name": "金马王", "cannot_use": "12347", "must_have": "5"},
|
|||
|
|
# 4. 金马号:无2347,可用015689必须有1和5
|
|||
|
|
{"name": "金马号", "cannot_use": "2347", "must_have": "15"},
|
|||
|
|
# 5. 金山王:无12457,可用03689必须有3
|
|||
|
|
{"name": "金山王", "cannot_use": "12457", "must_have": "3"},
|
|||
|
|
# 6. 天马王:无1247,可用035689必须有3和5
|
|||
|
|
{"name": "天马王", "cannot_use": "1247", "must_have": "35"},
|
|||
|
|
# 7. 金山号:无2457,可用013689必须有1和3
|
|||
|
|
{"name": "金山号", "cannot_use": "2457", "must_have": "13"},
|
|||
|
|
# 8. 天马号:无247,可用0135689必须有1、3和5
|
|||
|
|
{"name": "天马号", "cannot_use": "247", "must_have": "135"},
|
|||
|
|
# 9. 朦胧王:无13457
|
|||
|
|
{"name": "朦胧王", "cannot_use": "13457", "must_have": ""},
|
|||
|
|
# 10. 朦胧号:无3457
|
|||
|
|
{"name": "朦胧号", "cannot_use": "3457", "must_have": ""},
|
|||
|
|
# 11. 如意号:无1347
|
|||
|
|
{"name": "如意号", "cannot_use": "1347", "must_have": ""},
|
|||
|
|
# 12. 钻石号:无347
|
|||
|
|
{"name": "钻石号", "cannot_use": "347", "must_have": ""},
|
|||
|
|
# 13. 永恒号:无47
|
|||
|
|
{"name": "永恒号", "cannot_use": "47", "must_have": ""},
|
|||
|
|
# 14. 无4号:不包含4
|
|||
|
|
{"name": "无4号", "cannot_use": "4", "must_have": ""},
|
|||
|
|
# 15. 通货:含4
|
|||
|
|
{"name": "通货", "cannot_use": "", "must_have": "4"},
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
|
|||
|
|
def extract_digits(serial: str) -> dict:
|
|||
|
|
"""提取冠字号中的数字部分"""
|
|||
|
|
if not serial:
|
|||
|
|
return {"digits": "", "type": "single"}
|
|||
|
|
|
|||
|
|
nums = serial.replace("J", "").replace(",", "").replace(".", "").strip()
|
|||
|
|
nums = "".join(c for c in nums if c.isdigit())
|
|||
|
|
|
|||
|
|
if nums.endswith("01"):
|
|||
|
|
return {"digits": nums[:-2], "type": "hundred"}
|
|||
|
|
elif nums.endswith("1"):
|
|||
|
|
return {"digits": nums[:-1], "type": "ten"}
|
|||
|
|
else:
|
|||
|
|
return {"digits": nums, "type": "single"}
|
|||
|
|
|
|||
|
|
|
|||
|
|
def matches_category(digits: str, category: dict) -> bool:
|
|||
|
|
cannot_use = category.get("cannot_use", "")
|
|||
|
|
must_have = category.get("must_have", "")
|
|||
|
|
|
|||
|
|
# 检查不能用的数字
|
|||
|
|
for n in cannot_use:
|
|||
|
|
if n in digits:
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
# 检查必须有的数字
|
|||
|
|
if must_have:
|
|||
|
|
for n in must_have:
|
|||
|
|
if n not in digits:
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_number_category(serial: str) -> str:
|
|||
|
|
"""号码分类函数"""
|
|||
|
|
if not serial:
|
|||
|
|
return ""
|
|||
|
|
|
|||
|
|
# 提取数字
|
|||
|
|
info = extract_digits(serial)
|
|||
|
|
digits = info["digits"]
|
|||
|
|
|
|||
|
|
if not digits:
|
|||
|
|
return ""
|
|||
|
|
|
|||
|
|
# 根据类型取对应位数
|
|||
|
|
digits_type = info["type"]
|
|||
|
|
if digits_type == "hundred":
|
|||
|
|
# 标百看后6位
|
|||
|
|
check_digits = digits[-6:] if len(digits) >= 6 else digits
|
|||
|
|
elif digits_type == "ten":
|
|||
|
|
# 标十看后7位
|
|||
|
|
check_digits = digits[-7:] if len(digits) >= 7 else digits
|
|||
|
|
else:
|
|||
|
|
# 散钞看全部
|
|||
|
|
check_digits = digits
|
|||
|
|
|
|||
|
|
# 按优先级匹配分类
|
|||
|
|
for category in CATEGORIES:
|
|||
|
|
if matches_category(check_digits, category):
|
|||
|
|
return category["name"]
|
|||
|
|
|
|||
|
|
return "通货"
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_number_category_color(category: str) -> str:
|
|||
|
|
"""获取分类颜色"""
|
|||
|
|
colors = {
|
|||
|
|
"圆圆号": "#ef4444", # 红
|
|||
|
|
"倒置号": "#f97316", # 橙
|
|||
|
|
"金马王": "#eab308", # 黄
|
|||
|
|
"金马号": "#84cc16", # 绿
|
|||
|
|
"金山王": "#22c55e", # 深绿
|
|||
|
|
"天马王": "#14b8a6", # 青
|
|||
|
|
"金山号": "#06b6d4", # 蓝
|
|||
|
|
"天马号": "#0ea5e9", # 浅蓝
|
|||
|
|
"朦胧王": "#6366f1", # 靛蓝
|
|||
|
|
"朦胧号": "#8b5cf6", # 紫
|
|||
|
|
"如意号": "#a855f7", # 深紫
|
|||
|
|
"钻石号": "#d946ef", # 品红
|
|||
|
|
"永恒号": "#ec4899", # 粉红
|
|||
|
|
"无4号": "#64748b", # 灰
|
|||
|
|
"通货": "#9ca3af", # 浅灰
|
|||
|
|
}
|
|||
|
|
return colors.get(category, "#9ca3af")
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_category_priority(category: str) -> int:
|
|||
|
|
"""获取分类优先级(数字越小越高级)"""
|
|||
|
|
for i, cat in enumerate(CATEGORIES, 1):
|
|||
|
|
if cat["name"] == category:
|
|||
|
|
return i
|
|||
|
|
return 999
|