在python中移动一个列

时间:2014-01-25 22:12:05

标签: python

我之前从未使用过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

所以它会将前柱移到后面等等

我需要在代码中添加什么才能完成此任务?

谢谢你们

1 个答案:

答案 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)