基于3行python中可能的字符映射生成所有可能的密码?

2024-09-28 21:33:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我在这个页面上遇到了一个面试问题:(http://newworld-alex.blogspot.com/2009/03/facebook-interviewzz.html)在

Technical question: In python, given a dictionary of character variations for some word, e.g. dictChars = {"e" : [E, 3], "x" : [X], "a" : [A, @], "m" : [M]} implement a password-cracker-like partial string permutation generator, i.e. produce exaM, exAm, exAM, ex@m, .... I implemented a simple 3-line recursive solution in Python.

我有一个用Python编写的解决方案,但我似乎不知道如何像他那样把它变成3行。在

仅供参考,以下是我目前的解决方案:

def allPossiblePasswords(password, mapping):
   if len(password) == 0:
      return [""]
   else:
      next = allPossiblePasswords(password[1:], mapping)
      if password[0] in mapping:
         return [c + n for c in mapping[password[0]] for n in next]
      else:
         return [password[0] + n for n in next]

提前谢谢!在


Tags: inhttpforreturnifpassword页面解决方案
3条回答

Self-plagiarism不算,对吧?在

import itertools

def all_possibles(password, mapping):
    char_options = ([char]+mapping.get(char,[]) for char in password)
    for poss in itertools.product(*char_options):
        yield ''.join(poss)

它可以做得像你喜欢的一样紧凑,即使是一行的变体:

^{pr2}$

编辑:啊。我没有注意到递归是一种要求。在这种情况下,如何:

def all_recur(password, mapping):
    return [''] if not password else [c + n for c in [password[0]] + mapping.get(password[0], []) for n in all_recur(password[1:], mapping)]

基本上只是你的压缩版本。请注意,这两个函数都返回“examin”(即未修改的密码);我不确定是否需要这样做。在

mapping = {'a': ['A', '@'], 'x': ['X'], 'e': ['E', 3], 'm': ['M']}

password = "exam"

from itertools import product
allPossible = list(product(*([letter] + mapping[letter] for letter in password)))

这在很多方面都是错误的。但我还是要贴出来。这是一个递归的解决方案。在

>>> def pw_vars(in_word, out_word, equivs):
...     if not in_word: return [out_word]
...     return sum((pw_vars(in_word[1:], out_word + c, equivs) for c in [in_word[0]] + equivs[in_word[0]]), [])
... 
>>> pw_vars('foo', '', {'f':['F', '='], 'o':['0', 'O']})
['foo', 'fo0', 'foO', 'f0o', 'f00', 'f0O', 'fOo', 'fO0', 'fOO', 'Foo', 'Fo0', 
 'FoO', 'F0o', 'F00', 'F0O', 'FOo', 'FO0', 'FOO', '=oo', '=o0', '=oO', '=0o', 
 '=00', '=0O', '=Oo', '=O0', '=OO']

我希望我不必说你不应该真的这么做。这个人真的得到这份工作了吗?我很怀疑。在

实际上,虽然我已经意识到DSM的版本更好——几乎可以忍受!这是我对DSM版本的版本,它的价值是什么(不是太多)。这个也符合马克·兰森下面的观点。在

^{pr2}$

相关问题 更多 >