每周一题(穷举密码)

每周一题(穷举密码)

在密码破解的时候,都需要根据给出的字典来生成所有的密码组合.
本周题目如下:
1、生成能根据给出的字符字典来生成指定长度的密码。
2、能被import。
3、有自测试代码。
关注
举例:给定 “a,b,c”, 给定长度为2。则输出应为
aa,ab,ac,ba,bb,bc,ca,cb,cc
?

菜鸟贴一个。
def getPwd(s,length):
    'import function'
    sSet=set(s)
    if len(sSet)<length:return 0
    result=tmp=list(sSet)
    for i in range(length-1):
        result=createPwd(result,tmp)
    return result

def createPwd(sList,kList):
    assert len(sList)*len(kList)>0
    upper,sList=len(sList),sList*len(kList)
    for i in range(len(kList)):
        for j in range(upper):
            sList[i*upper+j]+=kList[i]
    return sList

def main():
    s='abc'
    print getPwd(s,3)

if __name__ == '__main__':
    main()


结果:['aaa', 'caa', 'baa', 'aca', 'cca', 'bca', 'aba', 'cba', 'bba', 'aac', 'cac', 'bac', 'acc', 'ccc', 'bcc', 'abc', 'cbc', 'bbc', 'aab', 'cab', 'bab', 'acb', 'ccb', 'bcb', 'abb', 'cbb', 'bbb']

def get_pwd(str, num):
        if(num == 1):
                return [x for x in str]
        else:
                return [ x+y for x in str for y in get_pwd(str, num-1)]

if __name__ == '__main__':
    print get_pwd('abc', 3)

结果为:['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']



QUOTE:
原帖由 chunchengfh 于 2009-1-9 10:44 发表
def get_pwd(str, num):
        if(num == 1):
                return [x for x in str]
        else:
                return [ x+y for x in str for y in get_pwd(str, num-1)]

if __name__ == '__main__':
    print get_pwd('abc', 3)

...

不错,比我的代码强多了。
不会递归