我之前从未使用过python,但是对于一个学校单位我认为我应该学习它,我有一个破解的密文,并且由于这里的一些帮助,我得到了一个蛮力攻击转换工作:)
我想尝试和下一步是尝试所有可能的网格大小,我现在也想尝试所有不同的列变体
ICBKAOREMDERAEAA
这是我的代码破坏者,
用手破解这个我必须设置一个4 x 4网格
I C B K
A O R E
M D E R
A E A A
我可以用代码来实现这个目标:
s = "ICBKAOREMDERAEAA"
for i in range(1, len(s) + 1): # range doesn't include upper bound
rows = [s[x:x+i] for x in range(0, len(s), i)]
#print('\n'.join(rows))
columns = list(zip(*rows))
print columns
但我现在要做的是,尝试每个列组合,所以对于上面的内容它也会尝试:
C B K I
O R E A
D E R M
E A A A
所以它会将前柱移到后面等等
我需要在代码中添加什么才能完成此任务?
谢谢你们
答案 0 :(得分:2)
使用字符串切片来获取单独的列表。
import math
encoded_txt = "ICBKAOREMDERAEAA"
GRIDSIZE = int(math.sqrt(len(encoded_txt)))
columns = [encoded_txt[i::GRIDSIZE] for i in range(GRIDSIZE)]
>>> columns
['IAMA', 'CODE', 'BREA', 'KERA']
然后使用itertools查找所有排列
>>>import itertools
>>>for permutation in itertools.permutations(columns):
print(''.join(permutation))
IAMACODEBREAKERA
IAMACODEKERABREA
IAMABREACODEKERA
IAMABREAKERACODE
IAMAKERACODEBREA
IAMAKERABREACODE
CODEIAMABREAKERA
CODEIAMAKERABREA
CODEBREAIAMAKERA
CODEBREAKERAIAMA
CODEKERAIAMABREA
CODEKERABREAIAMA
BREAIAMACODEKERA
BREAIAMAKERACODE
BREACODEIAMAKERA
BREACODEKERAIAMA
BREAKERAIAMACODE
BREAKERACODEIAMA
KERAIAMACODEBREA
KERAIAMABREACODE
KERACODEIAMABREA
KERACODEBREAIAMA
KERABREAIAMACODE
KERABREACODEIAMA
现在,如果您只想获得仍然按列顺序排列的排列,我会写一些新的代码:
def orderedpermutations(lst):
from copy import copy # possibly deepcopy, but unnecessary for this implementation
new_list = copy(lst)
for _ in range(len(new_list)):
new_list.append(new_list.pop(0))
yield new_list
然后你可以将它用作生成器:
for permutation in orderedpermutations(columns):
print(permutation)