作品展示:
运用math预测N*N最大排序数量
背景需求:
测试5宫格有多少种不重复的基础模板(只测试所有的25数字一组有多少个)
# 测试11*11格,2*2一共4套3*3 宫格
'''
目的:数独14 5宫格有不同的基础模板
作者:阿夏
时间:2024年01月04日 13:35
'''
import random
from win32com.client import constants,gencache
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants # 导入枚举常数模块
import os,time
import docx
from docx import Document
from docx.shared import Pt
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor
# 生成题库
import random
import math
from itertools import permutations
# num=int(input('生成几份\n'))
# 制作"单元格"# 几宫格
hsall=5
# int(input('3宫格数独=3\n'))
hs=hsall
print('------第2步:制作3宫格的12套题的内容-------')
# 制作3宫格的12套题目(没有空格,只有基础模板)
lst=[]
for b in range(1,hs+1):
lst.append(b)
print(lst)
permutations_list = list(permutations(lst))
numbers = [list(permutation) for permutation in permutations_list]
print(numbers)
# [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
# 6种组合
# 互相组合成3组
import itertools
# 计算排列数量并生成所有可能的排列
combinations2 = list(itertools.permutations(numbers, hs))
# 输出排列数量
# print(len(combinations2))
# 120
# # 把所有数字都提取成元素
ll=[]
for o1 in combinations2:
for o2 in o1:
for o3 in o2:
ll.append(o3)
# print(ll)
# print(len(ll))
# 1080
v=hs*hs
# 16个数字抽取一组
f=[]
for i in range(int(len(ll)/v)):
f.append(ll[i*v:i*v+v])
# print(f)
print(len(f))
#120条
# # # # 遍历表格,把0、5、10相同的内容删除,横向的数字1234都正确了,现在只要排除竖向不对的
# P=[]
# zz=[]
# u=[]
# for k in f:
# if int(k[0])!=int(k[4])and \
# int(k[0])!=int(k[8])and
# int(k[0])!=int(k[12]) and int(k[4])!=int(k[8]) and int(k[4])!=int(k[12])and int(k[8])!=int(k[12]) and \
# int(k[0])+int(k[4])+int(k[8])+int(k[12])==10 and \
# int(k[1])!=int(k[5])and int(k[1])!=int(k[9])and int(k[1])!=int(k[13]) and int(k[5])!=int(k[9]) and int(k[5])!=int(k[13])and int(k[9])!=int(k[13]) and int(k[1])+int(k[5])+int(k[9])+int(k[13])==10 and \
# int(k[2])!=int(k[6])and int(k[2])!=int(k[10])and int(k[2])!=int(k[14]) and int(k[6])!=int(k[10]) and int(k[6])!=int(k[14])and int(k[10])!=int(k[14]) and int(k[2])+int(k[6])+int(k[10])+int(k[14])==10 and\
# int(k[3])!=int(k[7])and int(k[3])!=int(k[11])and int(k[3])!=int(k[15]) and int(k[7])!=int(k[11]) and int(k[7])!=int(k[15])and int(k[11])!=int(k[15]) and int(k[3])+int(k[7])+int(k[11])+int(k[15])==10:
# zz.append(k)
# print(zz)
# print('不重复题目数量{}'.format(len(zz)))
运行了90分钟,结果报错 MemoryError,显示内存不够计算
显示内存不够计算
解决思路,通过代码推理数量
一、测试N宫格有多少组不同的排列方法
3宫格基本数字"[1, 2, 3]"
3宫格可以组成基本样式[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
3宫格可以组成基本样式数量"6"组
'''
目的:测试N宫格可以生成多少组基本样式[1,2,3,4,5][5,4,3,2,1]}
作者:阿夏
时间:2024年1月5日19:00
'''
import random
import math
from itertools import permutations
# 宫格数
gg=[1,2,3,4,5,6,7,8,9]
# gg=[5]
ggg=[]
for hs in gg:
n=[]
for nu in range(1,hs+1):
n.append(nu)
# lst = ''.join(str(num) for num in n)
# print(n)
print('{}宫格基本数字"{}"'.format(hs,n))
# 3宫格,基础数字是'123'
# 123中间随机抽取3个,不同的3个数字排序方法
permutations_list = list(permutations(n))
numbers = [list(permutation) for permutation in permutations_list]
# numbers = ''.join(str(num) for num in number)
# print(numbers)
print('{}宫格可以组成基本样式"{}"组'.format(hs,len(numbers)))
# [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]# 6种组合
'''
1宫格基本数字"1"
1宫格可以组成基本样式"1"组
2宫格基本数字"12"
2宫格可以组成基本样式"2"组
3宫格基本数字"123"
3宫格可以组成基本样式"6"组
4宫格基本数字"1234"
4宫格可以组成基本样式"24"组
5宫格基本数字"12345"
5宫格可以组成基本样式"120"组
6宫格基本数字"123456"
6宫格可以组成基本样式"720"组
7宫格基本数字"1234567"
7宫格可以组成基本样式"5040"组
8宫格基本数字"12345678"
8宫格可以组成基本样式"40320"组
9宫格基本数字"123456789"
9宫格可以组成基本样式"362880"组
'''
5宫格基本数字"[1, 2, 3, 4, 5]"
3宫格可以组成基本样式[[1, 2, 3, 4, 5], [1, 2, 3, 5, 4], [1, 2, 4, 3, 5], [1, 2, 4, 5, 3], [1, 2, 5, 3, 4], [1, 2, 5, 4, 3], [1, 3, 2, 4, 5], [1, 3, 2, 5, 4], [1, 3, 4, 2, 5], [1, 3, 4, 5, 2], [1, 3, 5, 2, 4], [1, 3, 5, 4, 2], [1, 4, 2, 3, 5], [1, 4, 2, 5, 3], [1, 4, 3, 2, 5], [1, 4, 3, 5, 2], [1, 4, 5, 2, 3], [1, 4, 5, 3, 2], [1, 5, 2, 3, 4], [1, 5, 2, 4, 3], [1, 5, 3, 2, 4], [1, 5, 3, 4, 2], [1, 5, 4, 2, 3], [1, 5, 4, 3, 2], [2, 1, 3, 4, 5], [2, 1, 3, 5, 4], [2, 1, 4, 3, 5], [2, 1, 4, 5, 3], [2, 1, 5, 3, 4], [2, 1, 5, 4, 3], [2, 3, 1, 4, 5], [2, 3, 1, 5, 4], [2, 3, 4, 1, 5], [2, 3, 4, 5, 1], [2, 3, 5, 1, 4], [2, 3, 5, 4, 1], [2, 4, 1, 3, 5], [2, 4, 1, 5, 3], [2, 4, 3, 1, 5], [2, 4, 3, 5, 1], [2, 4, 5, 1, 3], [2, 4, 5, 3, 1], [2, 5, 1, 3, 4], [2, 5, 1, 4, 3], [2, 5, 3, 1, 4], [2, 5, 3, 4, 1], [2, 5, 4, 1, 3], [2, 5, 4, 3, 1], [3, 1, 2, 4, 5], [3, 1, 2, 5, 4], [3, 1, 4, 2, 5], [3, 1, 4, 5, 2], [3, 1, 5, 2, 4], [3, 1, 5, 4, 2], [3, 2, 1, 4, 5], [3, 2, 1, 5, 4], [3, 2, 4, 1, 5], [3, 2, 4, 5, 1], [3, 2, 5, 1, 4], [3, 2, 5, 4, 1], [3, 4, 1, 2, 5], [3, 4, 1, 5, 2], [3, 4, 2, 1, 5], [3, 4, 2, 5, 1], [3, 4, 5, 1, 2], [3, 4, 5, 2, 1], [3, 5, 1, 2, 4], [3, 5, 1, 4, 2], [3, 5, 2, 1, 4], [3, 5, 2, 4, 1], [3, 5, 4, 1, 2], [3, 5, 4, 2, 1], [4, 1, 2, 3, 5], [4, 1, 2, 5, 3], [4, 1, 3, 2, 5], [4, 1, 3, 5, 2], [4, 1, 5, 2, 3], [4, 1, 5, 3, 2], [4, 2, 1, 3, 5], [4, 2, 1, 5, 3], [4, 2, 3, 1, 5], [4, 2, 3, 5, 1], [4, 2, 5, 1, 3], [4, 2, 5, 3, 1], [4, 3, 1, 2, 5], [4, 3, 1, 5, 2], [4, 3, 2, 1, 5], [4, 3, 2, 5, 1], [4, 3, 5, 1, 2], [4, 3, 5, 2, 1], [4, 5, 1, 2, 3], [4, 5, 1, 3, 2], [4, 5, 2, 1, 3], [4, 5, 2, 3, 1], [4, 5, 3, 1, 2], [4, 5, 3, 2, 1], [5, 1, 2, 3, 4], [5, 1, 2, 4, 3], [5, 1, 3, 2, 4], [5, 1, 3, 4, 2], [5, 1, 4, 2, 3], [5, 1, 4, 3, 2], [5, 2, 1, 3, 4], [5, 2, 1, 4, 3], [5, 2, 3, 1, 4], [5, 2, 3, 4, 1], [5, 2, 4, 1, 3], [5, 2, 4, 3, 1], [5, 3, 1, 2, 4], [5, 3, 1, 4, 2], [5, 3, 2, 1, 4], [5, 3, 2, 4, 1], [5, 3, 4, 1, 2], [5, 3, 4, 2, 1], [5, 4, 1, 2, 3], [5, 4, 1, 3, 2], [5, 4, 2, 1, 3], [5, 4, 2, 3, 1], [5, 4, 3, 1, 2], [5, 4, 3, 2, 1]]
5宫格可以组成基本样式数量"120"组
参考AI对话大师的答案,使用math计算方法
加上math计算
'''
目的:测试N宫格可以生成多少组基本样式[1,2,3,4,5][5,4,3,2,1]}
作者:阿夏
时间:2024年1月5日19:00
'''
import random
import math
from itertools import permutations
# 宫格数
gg=[1,2,3,4,5,6,7,8,9]
# gg=[5]
ggg=[]
for hs in gg:
n=[]
for nu in range(1,hs+1):
n.append(nu)
# lst = ''.join(str(num) for num in n)
# print(n)
print('{} 宫格基本数字 "{} "'.format(hs,n))
# 3宫格,基础数字是'123'
# 123中间随机抽取3个,不同的3个数字排序方法
permutations_list = list(permutations(n))
numbers = [list(permutation) for permutation in permutations_list]
# numbers = ''.join(str(num) for num in number)
# print(numbers)
print('{} 宫格可以组成基本样式" {} "组'.format(hs,len(numbers)))
# [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]# 6种组合
# math生成可能的数量
combinations = math.comb(len(numbers), hs)
print("math法{} 宫格可以生成 {} 组不同的列表".format(hs ,combinations))
# 在原有基础上乘上基本样式组的数量,如宫格基本样式是6组【123】【132】【213】【231】【312】【321】,通过互相交叉选取3个为一组,会有20种可能
# 最后需要20*6=120,才是最大的生成数量。因此math计算后,还要乘以基本样式数量
print("实际法{} 宫格可以生成{} 组不同的列表".format(hs ,combinations*len(numbers)))
print('---------------')
结果:
1宫格基本数字"[1]"
1宫格可以组成基本样式"1"组
math法1宫格可以生成1组不同的列表
实际法1宫格可以生成1组不同的列表
---------------
2宫格基本数字"[1, 2]"
2宫格可以组成基本样式"2"组
math法2宫格可以生成1组不同的列表
实际法2宫格可以生成2组不同的列表
---------------
3宫格基本数字"[1, 2, 3]"
3宫格可以组成基本样式"6"组
math法3宫格可以生成20组不同的列表
实际法3宫格可以生成120组不同的列表
---------------
4宫格基本数字"[1, 2, 3, 4]"
4宫格可以组成基本样式"24"组
math法4宫格可以生成10626组不同的列表
实际法4宫格可以生成255024组不同的列表
---------------
以下不能用Python计算(数量太多了 )
5宫格基本数字"[1, 2, 3, 4, 5]"
5宫格可以组成基本样式"120"组
math法5宫格可以生成190578024组不同的列表
实际法5宫格可以生成22869362880组不同的列表
---------------
6宫格基本数字"[1, 2, 3, 4, 5, 6]"
6宫格可以组成基本样式"720"组
math法6宫格可以生成189492294437160组不同的列表
实际法6宫格可以生成136434451994755200组不同的列表
---------------
7宫格基本数字"[1, 2, 3, 4, 5, 6, 7]"
7宫格可以组成基本样式"5040"组
math法7宫格可以生成16321981448897949868560组不同的列表
实际法7宫格可以生成82262786502445667337542400组不同的列表
---------------
8宫格基本数字"[1, 2, 3, 4, 5, 6, 7, 8]"
8宫格可以组成基本样式"40320"组
math法8宫格可以生成173117930575796585984663510371920组不同的列表
实际法8宫格可以生成6980114960816118346901632738195814400组不同的列表
---------------
9宫格基本数字"[1, 2, 3, 4, 5, 6, 7, 8, 9]"
9宫格可以组成基本样式"362880"组
math法9宫格可以生成300649979042426162195454856425990347600496000组不同的列表
实际法9宫格可以生成109099864394915605737486658299863377337267988480000组不同的列表