【问题标题】:Most efficient way to generate possible plugboard settings for the enigma with python使用python为谜题生成可能的插件板设置的最有效方法
【发布时间】:2020-02-17 01:32:11
【问题描述】:

我正在考虑用 python 破解谜语密码,并且需要生成插件板组合 - 我需要一个函数,它接受 length 参数并返回所有可能组合的生成器对象作为列表。

示例代码:

for comb in func(2):
   print(comb)
# Example output
['AB', 'CD']
['CD', 'EF']
...

有谁知道提供这种生成器的库,或者如何制作一个?

编辑:关于谜的更多细节

插件板设计详情请见here

此外,生成器的输出格式必须可连接到此格式 运行整个生成器:

'AB FO ZP GI HY KS JW MQ XE ...' 对数将是函数中的length 参数。

【问题讨论】:

  • 您能否edit 为我们这些不熟悉 Enigma 的人添加算法描述?询问原因给定的输出不是简单的组合。
  • 维基百科页面没有提到算法
  • @wjandrea 算法?
  • 是的,插件板设置是如何生成的?或者他们遵循什么模式?
  • 他们不在战争期间。插件板是一种简单的物理替代密码,增加了 enigma 的安全性。我需要的格式如上所述;例如'AB FO ZP GI HY KS JW MQ XE ...' 表示A 映射到B,反之亦然,F 映射到O,等等。

标签: python list generator


【解决方案1】:

这是否与您所追求的相近?告诉我,我可以修改。

plugboard() 函数返回 (yield) 一个 generator 对象,可以通过可迭代循环或调用 next() 函数来访问该对象。

from itertools import product

def plugboard(chars, length):
    for comb in product(chars, repeat=length):
        yield ''.join(comb)

这样的调用将创建combs 作为generator 对象:

combs = plugboard('abcde', 2)
type(combs)

>>> generator

要访问您可以使用的值:

next(combs)
>>> 'aa'

或者:

for i in combs: print(i)

ab
ac
ad
ae
ba
bb
bc
...

【讨论】:

  • 我会试试这个功能。
【解决方案2】:

我想你要找的是itertools.combinations

>>> from itertools import combinations
>>> list(combinations('abcd', 2))
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]
>>> [''.join(comb) for comb in combinations('abcd', 2)]
['ab', 'ac', 'ad', 'bc', 'bd', 'cd']

【讨论】:

  • 它会起作用,但要使它起作用,您需要更多(额外)代码,并将整个生成器对象作为列表运行,这对我来说不起作用正在运行生成器,输出大约 9 万亿个项目 - 这会导致大多数 PC 出现内存错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 2013-05-30
  • 2023-03-05
  • 2017-10-28
  • 2023-04-02
  • 2012-10-23
  • 1970-01-01
相关资源
最近更新 更多