Q13字母四则运算2

E:/GitHub/suanfaquti/Q13字母四则运算2.py
'''
问题描述
等式read+write+talk=skill中每个字母对应一个不同的数字,寻找满足等式的所有情况。

分析
确认有多少(m)个不同的字母,使用itertools.permutations(range(10),m)可以得到
0-9中任取m个数字的所有组合,遍历每种组合,建立和m个字母的映射,
用format+eval替换字母成数字,用eval测试等式是否成立。
不使用字典建立映射,直接用原列表。速度并没有变快
'''

import re,time
from itertools import permutations

def g(a,b):
    return a.index(b)

t1=time.clock()

s='read+write+talk=skill'
#s='re+wr/i+lk=all'
s=s.lower().replace('=','==')

s_alpha=re.sub('[^a-zA-Z]','',s)        #去掉字母以外的字符
sa=[]
for i in s_alpha:                       #对字母去重并保持原来的顺序
    if not i in sa: 
        sa.append(i)

if len(sa)>10:
    print('字母个数大于10')
    quit()

                                        #获取首字母的集合,这个数字不能为0    
firstchars=set(i[0] for i in re.split('[^a-zA-Z]',s) if len(i)>0)
print(firstchars)

l=list(permutations(range(10),len(sa)))      #获得所有组合的列表

s1=re.sub('[a-zA-Z]','{}',s)
s2=''.join("i[{}],".format(sa.index(i)) for i in s_alpha)
res='\"'+s1+'\".format('+s2+')'         #替换字母成数字,拼接成等式的字符串
print(s_alpha)


for i in l:
    key=1
    for j in firstchars:
        if i[g(sa,j)]==0:
            key=0
            break
    if key==0:
        continue
    #下面这行加入其他判断条件,可以大幅度提高效率 
    if (i[g(sa,'w')]!=i[g(sa,'s')] and i[g(sa,'s')]!=i[g(sa,'w')]+1 \
        and i[g(sa,'s')]!=i[g(sa,'w')]+2) or \
        i[g(sa,'e')]+i[g(sa,'a')]!=9 or \
        (i[g(sa,'a')]+i[g(sa,'t')]!=8 and i[g(sa,'a')]+i[g(sa,'t')]!=9 \
         and  i[g(sa,'a')]+i[g(sa,'t')]!=10):
            continue
    try:
        #print(res)
        a=eval(res)
        #print(a)
        if eval(a):
            print(a)
    except Exception as e:
        print(e)

print(time.clock()-t1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值