2014-01-25 42 views
2

我以前從未使用python,但對於一個學校單元,我認爲我應該學習它,我有一個密碼文本要打破,並且感謝這裏的一些幫助,我得到了一個蠻力在transosition攻擊工作:)在python中移動一列

什麼,我想嘗試下一個是不是隻是想所有可能的網格大小,我現在也想嘗試所有不同的列變化以及

ICBKAOREMDERAEAA 

這是我的代碼斷路器,

手動破解我哈哈d建立一個4×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 

因此將前柱移到後面等

我會怎麼需要添加到我的代碼來完成此任務?

Thanks guys guys

+0

基本上你可以通過以下方法解決你的問題:s [0 :: 4],s [1 :: 4],s [2 :: 4],s [3 :: 4] – zmo

回答

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) 
+0

SOrry我該如何使用itertools ?我完全是python的新手 – user2292674

+1

我實際上並不經常使用'itertools',所以我不得不查閱文檔。我用相關的代碼編輯過。 –

+1

非常感謝您的幫助 – user2292674