2016-11-29 53 views
-1

昨天我得到了一個關於Rot的任務,我被告知要將所有26個代碼寫入代碼,或者至少有一個程序是這樣做的,所以我想我會從字典開始,因爲我想也想到一定的腐爛,我想出了這個。我的ascii值字典不起作用

def generate_rotated_dictionary(n): 
    for i in range(0, 26): 
     letter = alphabet_list[i] 
     new_let = ord(letter) + n 
     new_let = chr(new_let) 
     rot_dic.update({letter: new_let}) 
    return(rot_dic) 

不幸的是,這並不工作和結果:

{'a': 'b', 'c': 'd', 'b': 'c', 'e': 'f', 'd': 'e', 'g': 'h', 'f': 'g', 'i': 
'j', 'h': 'i', 'k': 'l', 'j': 'k', 'm': 'n', 'l': 'm', 'o': 'p', 'n': 'o', 
'q': 'r', 'p': 'q', 's': 't', 'r': 's', 'u': 'v', 't': 'u', 'w': 'x', 'v': 
'w', 'y': 'z', 'x': 'y', 'z': '{'} 

{'a': 'c', 'c': 'e', 'b': 'd', 'e': 'g', 'd': 'f', 'g': 'i', 'f': 'h', 'i': 
'k', 'h': 'j', 'k': 'm', 'j': 'l', 'm': 'o', 'l': 'n', 'o': 'q', 'n': 'p', 
'q': 's', 'p': 'r', 's': 'u', 'r': 't', 'u': 'w', 't': 'v', 'w': 'y', 'v': 
'x', 'y': 'z', 'x': 'z', 'z': '|'} 

{'a': 'd', 'c': 'f', 'b': 'e', 'e': 'h', 'd': 'g', 'g': 'j', 'f': 'i', 'i': 
'l', 'h': 'k', 'k': 'n', 'j': 'm', 'm': 'p', 'l': 'o', 'o': 'r', 'n': 'q', 
'q': 't', 'p': 's', 's': 'v', 'r': 'u', 'u': 'x', 't': 'w', 'w': 'z', 'v': 
'y', 'y': '|', 'x': 'z', 'z': '}'} 

{'a': 'e', 'c': 'g', 'b': 'f', 'e': 'i', 'd': 'h', 'g': 'k', 'f': 'j', 'i': 
'm', 'h': 'l', 'k': 'o', 'j': 'n', 'm': 'q', 'l': 'p', 'o': 's', 'n': 'r', 
'q': 'u', 'p': 't', 's': 'w', 'r': 'v', 'u': 'y', 't': 'x', 'w': 'z', 'v': 
'z', 'y': '}', 'x': '|', 'z': '~'} 

如何與結局修復它,我知道這是因爲我使用的ASCII值的,但怎麼辦我得到這個以再次開始(數字97)

+1

什麼是'ro t'? 「不起作用」是什麼意思?輸出與你想要的有什麼不同? –

+0

「我被告知把所有26個代碼寫在代碼中,」所有26個是什麼?請更具體和詳細,以便我們可以幫助你。 –

+0

想必他是在談論[rot13](https://en.wikipedia.org/wiki/ROT13)密碼及其25個其他變體。 – Kevin

回答

-2

幾乎不值得一個完整的答案,但你想在你轉換爲一個字符之前採取模012的new_let 26。通過做餘師,你有多遠過去26指數已經

考慮:

>>>26 + 13 # rot13 for z 
39 
>>>39 % 26 
13 
+0

downvote無評論或編輯建議.........? – Aaron

0
l = list('abcdefghijklmnopqrstuvwxyz') 

n = 1 
rot = dict((c, chr(97 + ((ord(c)-97 + n)%26))) for c in l) 

有一點密集,所以讓我們把它分解的理解:

(c, chr(97 + ((ord(c)-97 + n)%26))) 

產生一個字符的元組及其移位的對應物

chr(97 + ((ord(c)-97 + n)%26)) 

使得字符

97 + (ord(c)-97 + n)%26 

得到的是舊人物的價值,計算出有多少轉移了過來。

+1

'l =地圖(字符,範圍(97,122))' –

3

所以,如果你需要旋轉字母,您可以使用下面的方法:

import string 
alph = string.ascii_lowercase 
for i in range(26): 
    print(''.join([alph[(k + i) % 26] for k in range(26)])) 

輸出爲字母串與偏移:

abcdefghijklmnopqrstuvwxyz 
bcdefghijklmnopqrstuvwxyza 
cdefghijklmnopqrstuvwxyzab 
defghijklmnopqrstuvwxyzabc 
..... 
zabcdefghijklmnopqrstuvwxy 

如果你需要列出的字符串而不是隻是刪除join()。 如果你需要一些特定的旋轉像13,那麼你可以使用此代碼內部功能與參數:

def rot(i): 
    return ''.join([alph[(k + i) % 26] for k in range(26)]) 

這將給予具體的數字旋轉。 例子:

print(rot(13)) 

輸出:

nopqrstuvwxyzabcdefghijklm 
+0

謝謝,很多。 – Bart

0

因此,爲了總結,這裏有一個完整的方法:

# Generates a function which rotate a sequence by an offset 
def generate_rot(seq, offset): 
    l = len(seq) 
    def rot(c): 
     n = (seq.index(c) + offset) % l 
     return seq[n] 
    return rot 

> alpha = map(chr,range(97, 123)) # [a...z] 
> rot13 = generate_rot(alpha, 13) 
> print(rot13('a')) 
n 
> print(rot13('n')) 
a 
> rot21 = generate_rot(alpha, 21) 
v 

,您可以將其綁定到字母,具體是:

> def generate_alpha_rot(x): 
    return generate_rot(map(chr,range(97, 123)),x) 
# or using a lambda function to create it inline, because why not? 
> generate_alpha_rot = lambda x:generate_rot(map(chr,range(97, 123)),x) 
> rot22 = generate_alpha_rot(22) 
> rot22('a') 
w 
# Or call it inline: 
> generate_alpha_rot(23)('a') 
x