[英]Python 2.7: ROT13 letter substitution cipher
問題陳述:
ROT13是一種簡單的字母替換密碼,它將字母中的字母替換為后面的13個字母。 ROT13是凱撒密碼的一個示例。
創建一個接受字符串並返回用Rot13加密的字符串的函數。 如果字符串中包含數字或特殊字符,則應按原樣返回它們。 像原來的Rot13“實現”中一樣,僅應轉換來自拉丁語/英語字母的字母。
請注意,在Python中使用“編碼”被認為是作弊行為。
我的代碼:
from string import *
def rot13(message):
melist = list(message)
for i in message:
lpos = index(letters,i)
if i.islower():
print lpos
melist[index(message,i)] = lower(letters[lpos + 13])
elif i.isupper():
try:
melist[index(message,i)] = upper(letters[lpos + 13])
except IndexError:
melist[index(message,i)] = upper(letters[lpos + 13 - 52])
return ''.join(melist)
這個東西可以很好地轉換字符串,除了最后一個字母
例如,如果您這樣做:
>>> rot13('test')
'grft'
最后一個字符“ t”雖然沒有變化,但沒有改變,我不知道我在哪里做錯了。 一些幫助將不勝感激。
這里的問題不是最后一個字母。 這部分代碼將始終查找字符串中字母的首次出現:
letters.index(i)
因此,而不是給予最后的索引't'
的'test'
,你得到的第一個指數,即使你給'texttttttt'
輸入-所有過去的't'
將保持不變。
您必須對算法進行一些更改...
這是使用翻譯功能的rot13的非常簡單的版本。
import string
def rot13(message):
norm=string.maketrans('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', \
'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM')
return message.translate(norm)
print rot13("now is the time FOR ALL GOOD")
輸出是
abj vf gur gvzr SBE NYY TBBQ
問題不是最后一個字母,而是重復的字母:
>> print rot13('abba')
noba
原因是index
函數:
index(message,i)
它返回i
在message
第一次出現的位置。 一種解決方案是對index()
使用可選的start
參數,以指定搜索應從指定位置開始:
for j,i in enumerate(message):
lpos = index(letters,i)
if i.islower():
print lpos
// this will find the correct position of the current occurence of i
melist[index(message,i,j)] = lower(letters[lpos + 13])
...
您的問題來自使用“索引”方法!
在您的示例中,處理了第二個“ t”,但結果將與列表中第一個“ t”位於相同的位置。
我認為這里的索引沒有用,您可以簡單地以空開頭,然后將每個字母附加到列表的末尾,同樣:
melist = []
for i in message:
if i.islower():
melist.append(lower(letters[lpos + 13]))
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.