创建一个蛮力的迭代器

时间:2016-04-21 10:32:59

标签: list python-3.x iterator combinations permutation

大家好我正在尝试编写一个不带参数的函数 hack(),并在所有可能的密码上返回一个迭代器。

基本上,我必须使用迭代器来强制密码。我从这个问题中得知的是:

  • 密码由三个部分组成。
  • 密码的第一部分是以下单词列表中两个单词的串联:[" hello"," BEGONE"," dog", " MrCool"]
  • 中段是" Donkey20"
  • 最后一段由两个数字组成(即1和7 = 17),不大于38.(至少为0)

我的思维方法是:

  1. 使用排列()查找POSSIBLE_WORDS的所有可能组合。 (找到所有段1的可能性)
  2. 对于新列表中的每个组合,添加" Donkey20"到最后。 (例如:helloBEGONEDonkey20)

  3. 查找THAT列表和POSSIBLE_NUMBERS中元素之间的所有可能组合。

  4. 创建迭代所有这些可能密码的迭代器,并将其返回

  5. 我目前的代码只能执行第2步,但是在每个组合结束时,不是Donkey20,而是在开始时。 (例如Donkey20helloBEGONE而不是helloBEGONEDonkey20)

    POSSIBLE_WORDS = ["hello", "BEGONE", "dog", "MrCool"]
    MIDDLE = "Donkey20"
    possible_numbers1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
    possible_numbers2 = [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28]
    possible_numbers3 = [29, 30, 31, 32, 33, 34, 35, 36, 37, 38]
    POSSIBLE_NUMBERS = possible_numbers1 + possible_numbers2 + possible_numbers3
    
    from itertools import permutations, combinations
    
    def hack():
        first_words = [''.join(word) for word in permutations(POSSIBLE_WORDS, 2)]
        first_words.append(MIDDLE)
        first_half = [''.join(word) for word in permutations(first_words, 2)]
    

    有什么方法可以解决这个问题吗?我如何完成其​​余步骤?我可以使用不同的方法来编写这个程序吗?

    非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

首先,没有理由像这样建立POSSIBLE_NUMBERS。只需使用range(39)list(range(39))代替。

你的意图

first_words.append(MIDDLE)

几乎可以肯定将单个单词“Donkey20”添加到所有可能的第一部分的列表的末尾,而是将其添加到结尾处每个第一个单词。我认为通过删除该行以及以下行并使用单行来更好地表达您对该部分代码的意图

first_half = [word + MIDDLE for word in first_words]

当您将最终可能的密码放在一起时,您需要将数字转换为字符串。毫无疑问,您已经了解str(),但该功能的缺点是str(1)'1',而您可能需要'01'。在此上下文中,您可能希望使用format(),因为format(1,'02')会返回'01'

这应该足以让你前进。由于这似乎是家庭作业,我不想再说了。