from itertools import combinations
# 所有可能的号码(01-35)
numbers = list(range(1, 36))
# 转换为组合(5个数)
all_combinations = list(combinations(numbers, 5))
# 定义组及匹配规则
groups = {
1: {"nums": [4, 6, 10, 13, 19, 20, 23, 25, 29, 33], "min": 1, "max": 1},
2: {"nums": [1, 2, 5, 6, 10, 11, 12, 15, 16, 20, 21, 22, 25, 26, 30, 31, 32], "min": 3, "max": 3},
3: {"nums": [2, 3, 6, 9, 10, 25, 26, 29, 30, 31, 34, 35], "min": 1, "max": 1},
4: {"nums": [3, 7, 9, 11, 17, 19, 21, 28, 31, 35], "min": 1, "max": 1},
5: {"nums": [3, 4, 13, 14, 19, 20, 24, 28, 32, 35], "min": 2, "max": 2},
6: {"nums": [2, 5, 8, 10, 11, 13, 18, 21, 29], "min": 0, "max": 0}
}
# 其他规则函数
def valid_combo(combo):
combo_set = set(combo)
# 组匹配规则
for group in groups.values():
count = len(combo_set & set(group["nums"]))
if not (group["min"] <= count <= group["max"]):
return False
# 奇偶比不能是0:5或5:0
evens = sum(1 for n in combo if n % 2 == 0)
odds = 5 - evens
if evens == 0 or odds == 0:
return False
# 区间比为1:2:2
zone1 = sum(1 for n in combo if 1 <= n <= 12)
zone2 = sum(1 for n in combo if 13 <= n <= 24)
zone3 = sum(1 for n in combo if 25 <= n <= 35)
if (zone1, zone2, zone3) != (2, 1, 2):
return False
# 和值限制
total = sum(combo)
if total <= 44 or total in [47,63,77,80,83,88,89,90,101,105,117]:
return False
return True
# 过滤组合
valid_combinations = [" ".join(f"{n:02d}" for n in combo) for combo in all_combinations if valid_combo(combo)]
len(valid_combinations), valid_combinations[:50] # 限制显示前50组结果
ZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNvbWJpbmF0aW9ucwoKIyDmiYDmnInlj6/og73nmoTlj7fnoIHvvIgwMS0zNe+8iQpudW1iZXJzID0gbGlzdChyYW5nZSgxLCAzNikpCgojIOi9rOaNouS4uue7hOWQiO+8iDXkuKrmlbDvvIkKYWxsX2NvbWJpbmF0aW9ucyA9IGxpc3QoY29tYmluYXRpb25zKG51bWJlcnMsIDUpKQoKIyDlrprkuYnnu4Tlj4rljLnphY3op4TliJkKZ3JvdXBzID0gewogICAgMTogIHsibnVtcyI6IFs0LCA2LCAxMCwgMTMsIDE5LCAyMCwgMjMsIDI1LCAyOSwgMzNdLCAibWluIjogMSwgIm1heCI6IDF9LAogICAgMjogIHsibnVtcyI6IFsxLCAyLCA1LCA2LCAxMCwgMTEsIDEyLCAxNSwgMTYsIDIwLCAyMSwgMjIsIDI1LCAyNiwgMzAsIDMxLCAzMl0sICJtaW4iOiAzLCAibWF4IjogM30sCiAgICAzOiAgeyJudW1zIjogWzIsIDMsIDYsIDksIDEwLCAyNSwgMjYsIDI5LCAzMCwgMzEsIDM0LCAzNV0sICJtaW4iOiAxLCAibWF4IjogMX0sCiAgICA0OiAgeyJudW1zIjogWzMsIDcsIDksIDExLCAxNywgMTksIDIxLCAyOCwgMzEsIDM1XSwgIm1pbiI6IDEsICJtYXgiOiAxfSwKICAgIDU6ICB7Im51bXMiOiBbMywgNCwgMTMsIDE0LCAxOSwgMjAsIDI0LCAyOCwgMzIsIDM1XSwgIm1pbiI6IDIsICJtYXgiOiAyfSwKICAgIDY6IHsibnVtcyI6IFsyLCA1LCA4LCAxMCwgMTEsIDEzLCAxOCwgMjEsICAyOV0sICJtaW4iOiAwLCAibWF4IjogMH0KfQoKIyDlhbbku5bop4TliJnlh73mlbAKZGVmIHZhbGlkX2NvbWJvKGNvbWJvKToKICAgIGNvbWJvX3NldCA9IHNldChjb21ibykKICAgIAogICAgIyDnu4TljLnphY3op4TliJkKICAgIGZvciBncm91cCBpbiBncm91cHMudmFsdWVzKCk6CiAgICAgICAgY291bnQgPSBsZW4oY29tYm9fc2V0ICYgc2V0KGdyb3VwWyJudW1zIl0pKQogICAgICAgIGlmIG5vdCAoZ3JvdXBbIm1pbiJdIDw9IGNvdW50IDw9IGdyb3VwWyJtYXgiXSk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgCiAgICAjIOWlh+WBtuavlOS4jeiDveaYrzA6NeaIljU6MAogICAgZXZlbnMgPSBzdW0oMSBmb3IgbiBpbiBjb21ibyBpZiBuICUgMiA9PSAwKQogICAgb2RkcyA9IDUgLSBldmVucwogICAgaWYgZXZlbnMgPT0gMCBvciBvZGRzID09IDA6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgIyDljLrpl7Tmr5TkuLoxOjI6MgogICAgem9uZTEgPSBzdW0oMSBmb3IgbiBpbiBjb21ibyBpZiAxIDw9IG4gPD0gMTIpCiAgICB6b25lMiA9IHN1bSgxIGZvciBuIGluIGNvbWJvIGlmIDEzIDw9IG4gPD0gMjQpCiAgICB6b25lMyA9IHN1bSgxIGZvciBuIGluIGNvbWJvIGlmIDI1IDw9IG4gPD0gMzUpCiAgICBpZiAoem9uZTEsIHpvbmUyLCB6b25lMykgIT0gKDIsIDEsIDIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgICMg5ZKM5YC86ZmQ5Yi2CiAgICB0b3RhbCA9IHN1bShjb21ibykKICAgIGlmIHRvdGFsIDw9IDQ0IG9yIHRvdGFsIGluIFs0Nyw2Myw3Nyw4MCw4Myw4OCw4OSw5MCwxMDEsMTA1LDExN106CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgcmV0dXJuIFRydWUKCiMg6L+H5ruk57uE5ZCICnZhbGlkX2NvbWJpbmF0aW9ucyA9IFsiICIuam9pbihmIntuOjAyZH0iIGZvciBuIGluIGNvbWJvKSBmb3IgY29tYm8gaW4gYWxsX2NvbWJpbmF0aW9ucyBpZiB2YWxpZF9jb21ibyhjb21ibyldCgpsZW4odmFsaWRfY29tYmluYXRpb25zKSwgdmFsaWRfY29tYmluYXRpb25zWzo1MF0gICMg6ZmQ5Yi25pi+56S65YmNNTDnu4Tnu5PmnpwK