You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字母算术题(Letterometrics)Python求解代码优化求助

字母算术题求解性能优化求助

字母算术题(Letterometrics)是一种将每个字母匹配为唯一数字,使给定等式成立的谜题。例如SEND+MORE=MONEY,当O=0、M=1、Y=2、E=5、N=6、D=7、R=8、S=9时,等式9567+1085=10652成立。

需求说明

程序输入为一个字母算术题,等号左侧是两个数相加,右侧是结果数。需推导其解,注意数字不能以0开头,要求30秒内完成求解。

问题现状

已使用itertools.permutations实现求解,但执行时间波动极大(0.1秒至109秒),尝试切片优化后无明显效果,寻求可行的优化方案。

调试输入数据

  • THERE+ARE=RISKS
  • GREEN+ORANGE=COLORS
  • ELVIS+PRESLEY=POSTERS
  • DCLIX+DLXVI=MCCXXV
  • COUPLE+COUPLE=QUARTET

现有基础实现代码

from itertools import permutations
 
s = input().replace('+', ' ').replace('=', ' ')
s2 = set(s.replace(' ', ''))
s = s.split(' ')
otv = -1
 
for i in permutations(range(10), len(s2)):
    y = dict(zip((list(s2)), i))
    if int(y[s[0][0]]) == 0 or int(y[s[1][0]]) == 0 or int(y[s[2][0]]) == 0:
        continue
    if int(''.join(map(str, [y.get(key) for key in s[0]])))+int(''.join(map(str, [y.get(key) for key in s[1]]))) == int(''.join(map(str, [y.get(key) for key in s[2]]))):
        otv = ' '.join('{} {}'.format(key, val) for key, val in sorted(y.items()))
        break
 
print(otv)

尝试优化的切片版本代码

from itertools import permutations
 
s = input().replace('+', ' ').replace('=', ' ')
s2 = list(set(s.replace(' ', '')))
s3 = list(s)
s = s.split(' ')
otv = -1
 
for i in permutations(range(10), len(s2)):
    if i[0] == 0 or i[s2.index(s[1][0])] == 0 or i[s2.index(s[2][0])] == 0:
        continue
    y = dict(zip(s2, i))
    zy = [str(y[i]) for i in s3 if i.isalpha()]
    if int(''.join(zy[:len(s[0])])) + int(''.join(zy[len(s[0]):len(s[0])+len(s[1])])) == int(''.join(zy[len(s[0])+len(s[1])])):
        otv = ' '.join('{} {}'.format(key, val) for key, val in sorted(y.items()))
        break
 print(otv)

内容的提问来源于stack exchange,提问作者Вадим Косарев

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:11:15