簡體   English   中英

Python 2.7:ROT13字母替換密碼

[英]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)

它返回imessage 第一次出現的位置。 一種解決方案是對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM