2016-05-09 17 views
0

問題文:のPython 2.7:ROT13文字置換暗号

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は変わらないが、どこで間違ったのか分からない。いくつかの助けが大いに評価されるでしょう。

+0

'STRING'モジュールが推奨されていませんです! – linusg

+0

ワットr真剣 – leftunknown

+0

うーん? 'import stringの代わりに' 'mystring.index(i)' 'を使うことをお勧めします。文字列.index( 'mystring'、i) ' – linusg

答えて

0

ここでの問題は最後の文字ではありません。コードのこの部分は、常にあなたの文字列内の文字の最初の発生を見つける:

letters.index(i) 

をだからではなく、'test'で最後't'の指標を与える、あなたはとして'texttttttt'を与えた場合でも、最初のインデックスを取得します入力 - すべて最後の't'はそのままです。あなたのアルゴリズムでいくつかの変更をしなければならない

...

+0

うん、それはまさにコードが持っている問題です、ありがとう。 – leftunknown

+0

あなたは他の回答の提案の1つを使用し、それを受け入れることができます! – linusg

-1

問題は、最後の文字ではありませんが、問題が重複した文字である:

>> print rot13('abba') 
noba 

原因はindex関数です。

index(message,i) 

それがでi出現位置を返します。解決策は、指定された位置に開始すべきであるという検索を指定するには、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]) 
    ... 
-1

あなたの問題は、「インデックス」メソッドを使用することから来ています!

例では、2番目の 't'が処理されますが、結果はリストの最初の 't'と同じ場所に移動します。

私はここに、インデックスのための使用はありません数える、あなたは単に同様に、空で始まり、そしてあなたのリストの最後に各文字を追加することができます:ここで

melist = [] 
for i in message: 
    if i.islower(): 
     melist.append(lower(letters[lpos + 13])) 
... 
0

はROT13の非常に単純なバージョンがあることですtranslate関数を使用します。

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

関連する問題