我要做一个数学竞赛,它允许写程序来解决问题.

代码试图解决此问题:

白色+水=PICNIC,其中每个不同的字母代表不同的数字.找到PICNIC代表的数字.

不允许导入(tqdm只是一个进度条).下面是我try 的内容.以我的计算机运行的速度,它不足以参加泰晤士报的比赛,因为它需要从10到数字的幂的范围.

这个问题有明确的解决方案吗?

from tqdm import tqdm

def find_solution():
    for W in tqdm(range(10)):
        for H in tqdm(range(10), desc='H'):
            for I in tqdm(range(10), desc='I'):
                for T in tqdm(range(10)):
                    for E in tqdm(range(10)):
                        for A in (range(10)):
                            for R in (range(10)):
                                for P in (range(1, 10)): # P cannot be 0
                                    for C in (range(10)):
                                        for N in (range(10)):
                                            white = W * 10000 + H * 1000 + I * 100 + T * 10 + E
                                            water = W * 10000 + A * 1000 + T * 100 + E * 10 + R
                                            picnic = P * 100000 + I * 10000 + C * 1000 + N * 100 + I * 10 + C

                                            if white + water == picnic:
                                                return {'W': W, 'H': H, 'I': I, 'T': T, 'E': E, 'A': A, 'R': R, 'P': P, 'C': C, 'N': N}

    return None

solution = find_solution()

if solution:
    print("Solution found:")
    print(solution)
else:
    print("No solution found.")

推荐答案

comments :

  1. P=1,因为进位到第六位
  2. 由于生成进位,W必须为5-9(1)
  3. 任何字母都不能与另一个字母的值相同.
def find_solution():
    P = 1
    for W in range(5,10):
        for H in range(10):
            if H in (P,W): continue
            for I in range(10):
                if I in (H,P,W): continue
                for T in range(10):
                    if T in (I,H,P,W): continue
                    for E in range(10):
                        if E in (T,I,H,P,W): continue
                        for A in range(10):
                            if A in (E,T,I,H,P,W): continue
                            for R in range(10):
                                if R in (A,E,T,I,H,P,W): continue
                                for C in range(10):
                                    if C in (R,A,E,T,I,H,P,W): continue
                                    for N in range(10):
                                        if N in (C,R,A,E,T,I,H,P,W): continue
                                        white = W * 10000 + H * 1000 + I * 100 + T * 10 + E
                                        water = W * 10000 + A * 1000 + T * 100 + E * 10 + R
                                        picnic = P * 100000 + I * 10000 + C * 1000 + N * 100 + I * 10 + C

                                        if white + water == picnic:
                                            print(f' WHITE= {white}')
                                            print(f' WATER= {water}')
                                            print(f'PICNIC={picnic}')
                                            print()

find_solution()

输出(2个解决方案,~1秒):

 WHITE= 83642
 WATER= 85427
PICNIC=169069

 WHITE= 85642
 WATER= 83427
PICNIC=169069

当然,如果你可以使用库,速度会更快(~0.3秒).注意,itertools.permutations的文档有一个粗略的Python实现,但它比上面的硬编码版本慢:

from itertools import permutations

def find_solution():
    P=1
    for W,H,I,T,E,A,R,C,N in permutations([0,2,3,4,5,6,7,8,9]):
        if W < 5: continue
        white = W * 10000 + H * 1000 + I * 100 + T * 10 + E
        water = W * 10000 + A * 1000 + T * 100 + E * 10 + R
        picnic = P * 100000 + I * 10000 + C * 1000 + N * 100 + I * 10 + C

        if white + water == picnic:
            print(f' WHITE= {white}')
            print(f' WATER= {water}')
            print(f'PICNIC={picnic}')
            print()

find_solution()

Python相关问答推荐

Python在tuple上操作不会通过整个单词匹配

如何在箱形图中添加绘制线的传奇?

Python 约束无法解决n皇后之谜

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

无法使用requests或Selenium抓取一个href链接

"使用odbc_connect(raw)连接字符串登录失败;可用于pyodbc"

Python解析整数格式说明符的规则?

如何从数据库上传数据到html?

在ubuntu上安装dlib时出错

干燥化与列姆化的比较

如何在Gekko中使用分层条件约束

如何删除重复的文字翻拍?

如何求相邻对序列中元素 Select 的最小代价

应用指定的规则构建数组

如何从数据框列中提取特定部分并将该值填充到其他列中?

将数字数组添加到Pandas DataFrame的单元格依赖于初始化

在matplotlib中重叠极 map 以创建径向龙卷风图

Scipy.linprog的可行性有问题吗?(A_ub@x0<;=b_ub).all()为True-但是-linprog(np.zeros_like(X0),A_ub=A_ub,b_ub=b_ub)不可行

在不降低分辨率的情况下绘制一组数据点的最外轮廓

401使用有效的OAuth令牌向Google Apps脚本Web App发出POST请求时出现未经授权的错误(";