2017-08-26 4 views
2

Julius Caesar Cipherプログラムを作成しようとしていますが、文の先頭と末尾にランダムな文字を追加してねじれを加えようとしています。何らかの理由で長い文字列を入力すると、文字列の一部が印刷時に失われます。私はpython 3を使用しています。誰かがこの問題を解決する方法と、なぜこれが起こっているのか説明できますか?ありがとうPython Julius Caesar暗号プログラム

import random 
alpha = 'abcdefghijklmnopqrstuvwxyz' 
alphaupper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 


def encode(cleartext): 
    global alpha 
    global alphaupper 
    words = cleartext 
    cyphertext = "" 
    for char in words: 
     if char in alphaupper: 
      newpos = (alphaupper.find(char) + 13) % 26 
      cyphertext += alphaupper[newpos] 
     elif char in alpha: 
      newpos = (alpha.find(char) + 13) % 26 
      cyphertext += alpha[newpos] 
     else: 
      cyphertext += char 

    cyphertext = alpha[random.randrange(len(alpha) - 1)] + cyphertext + alpha[random.randrange(len(alpha) - 1)] 
    return cyphertext 


def decode(cleartext): 
    global alpha 
    global alphaupper 
    words = cleartext.replace(cleartext[len(cleartext) - 1], "") 
    words = words.replace(words[0], "") 
    cyphertext = "" 
    for char in words: 
     if char in alphaupper: 
      newpos = (alphaupper.find(char) + 13) % 26 
      cyphertext += alphaupper[newpos] 
     elif char in alpha: 
      newpos = (alpha.find(char) + 13) % 26 
      cyphertext += alpha[newpos] 
     else: 
      cyphertext += char 
    return cyphertext 


print("Julias Ceasar 13 letter shift") 


def men(): 
    words = input("Would you like to decode or encode: ") 
    if "decode" in words: 
     words = input("What would you like to decode: ") 
     print(decode(words)) 
     print('\n') 
     men() 
    elif "encode" in words: 
     words = input("What would you like to encode: ") 
     print(encode(words)) 
     print('\n') 
     men() 
    else: 
     print("Could not understand please try again") 
     print('\n') 
     men() 


if __name__ == "__main__": 
    men() 

OUTPUT:

Julias Ceasar 13 letter shift 
Would you like to decode or encode: encode 
What would you like to encode: This program deletes parts of this string for some reason 

ENCODED:

yGuvf cebtenz qryrgrf cnegf bs guvf fgevat sbe fbzr ernfbas 

DECODING:

Would you like to decode or encode: decode 
What would you like to decode: yGuvf cebtenz qryrgrf cnegf bs guvf fgevat sbe fbzr ernfbas 

最終的な復号SENTENCE:

This program deletes parts o this string or some reason 


Would you like to decode or encode: 
+1

注:rot13のポイントは、同じエンコードとデコード機能を必要としない点です。パディング文字を追加/削除するなどの作業を行っても、コードの重複を取り除き、バグの可能性を減らし、コードをより保守しやすくするために、rot13部分を別の方法に分解してください。 –

+0

エンコーディングを除いて、デコードするのが少し難しくなるように、最初と最後に余分な文字を追加する。デコード時に1つの関数であると想定された場合、余分な文字を削除して元の文字列にデコードする代わりに、余分な文字を追加して過去の文字列をデコードします。 – RafaelPiloto10

+0

"もしそれが1つの関数であるとすれば" - それは1つの関数にあるとは思われません。 1つの機能ですべてを行う必要はありません(おそらく教室外の課題やパズル以外)。問題の[分解](https://en.wikipedia.org/wiki/Decomposition_(computer_science))をより細かく調べて、まだ維持可能な大きなプログラムを構築することは良いことです。 –

答えて

2

を使用してみてくださいは、すべての出現を置き換えます。それはあなたが交渉した以上の文字を削除していることを意味します。あなたがしたいすべてが文字列から最初と最後の文字を削除された場合

することは、あなたが実際に何を最初と最後を気にしないので、非常にきれいです

words = cleartext[1:-1] 

ような何かを行うことができます文字です。

+0

私はおそらく知っていたはずのものなので、私はとてもばかげていると感じました。私はその学習プロセスの一部を推測し、初心者としてはもっと学びたいだけです。私の質問に答える時間をとっていただきありがとうございます。 – RafaelPiloto10

0

私はここで問題を知っていると思います。

これら2行:

words = cleartext.replace(cleartext[len(cleartext) - 1], "") 
words = words.replace(words[0], "") 

ここでの問題は、あなたが値ではなく、インデックスにより削除することを選択したということです。

オブジェクトのすべてのインスタンスが常に異なるオブジェクト参照を持つため、これはおそらくオブジェクトの配列(たとえば、removeを使用する場合)の で動作します。

(arr [1] = arr [3]のようなものを使用しない限り、参照をコピーしたことを意味します)。

とにかく、インデックスで置き換える場合は、インデックスで置き換えることをお勧めします。

さらに、関数を間違って使用しています。それは新しい文字列、 を引数として渡すと仮定しています。引数は置換する部分文字列と部分文字列です。 サブストリングのすべてのインスタンスを検索し、置換します。 それを削除するはずがありません。あなたは常にランダムな文字、 と長い文字列、それがランダムを持つことである可能性が高いのすべてのインスタンスを削除しているので

ので、大きなメッセージ 上のメッセージの一部を削除するために始めている理由は、おそらくですそこにチャー。

とにかく、私が使用して好き:

words = cleartext[1:len(cleartext)] 

を私はそのような何かを行うとき。

私はまた、そのような再帰呼び出しを行うには良いアイデアだとは思わない:主にあなたはそれがない知っていない場合であっても、ため

def men(): 
    input("something") 
    men() 

が、それぞれとevey時間

あなたは呼び出し元の場所を保存する再帰呼び出しを行います。

これは、再帰呼び出しだけでなく、ほとんどの関数呼び出しに当てはまります。

あなたは新しいintに等しいものを作成しますが、削除することはありません。オプションの第三countの引数が含まれていない場合

問題が復号する場合、あなたは

words = cleartext.replace(cleartext[len(cleartext) - 1], "") 
words = words.replace(words[0], "") 

str.replaceを行う、ということであるように見えます

if __name__ == "__main__": 
    while True: men() 
+0

私はおそらく知られていたはずだったので、わかりました。私はその学習プロセスの一部を推測し、初心者としてはもっと学びたいだけです。私の質問に答える時間をとっていただきありがとうございます。 – RafaelPiloto10