-1

これは私の課題です:

秘密のメッセージを解読するプログラムを書いてください。

最初に、スクランブルされたアルファベットの入力をユーザーに求める必要があります。次に、秘密のメッセージを要求する必要があります。最後に、スクランブルなしのバージョンを出力します。

スクランブルされたアルファベットには、正確に 26 文字の入力があることに注意してください。すべてのアルファベット文字は、デコードされた同等の文字に変換され (WHILE ループが必要です)、他のすべての非アルファベット文字は、変換されていない場合とまったく同じように出力される必要があります。

これまでの私のコードは次のとおりです。

decrypt = ["*"] * 26

scram_alphabet = input("Please input the scrambled alphabet in order: ")

while len(scram_alphabet) != 26:
    scram_alphabet = input("Please input the scrambled alphabet in order. The alphabet must have 26 characters: ")

num = 0

for each_letter in scram_alphabet:
    decrypt[num] = ord(each_letter)
    num = num + 1

print()

print("Your scrambled alphabet is: ", end = "")

for num in range (26):
    print(chr(decrypt[num]), end = "")

print()
print()

msg = input("Now input your scrambled message: ")

print()
print()

alphabet = 65

for s in range (26):
    decrypt[s] = (alphabet)
    alphabet = alphabet + 1

print("The unscrambled alphabet is: ", end = "")


for num in range (26):
    print(chr(decrypt[num]), end = "")

print()
print()

print("Your unscrambled message reads: ")

for alpha in msg.upper():
    if alpha < "A" or alpha > "Z":
        print(alpha, end="")
    else:
        ord_alpha = ord(alpha)
        print (chr(decrypt[ord_alpha - 65]), end = "")

例: スクランブルされたアルファベット = XQHAJDENKLTCBZGUYFWVMIPSOR 、スクランブルされたメッセージ = VNKW KW BO 1WV WJHFJV BJWWXEJ!

最後の print ステートメントに到達するまで、すべて正常に機能します。そこでは、スクランブルされていないメッセージがスクランブルされたメッセージと同じであることが示されています。命令で while ループが必要であることはわかっていますが、これを使用してアルファベットをデコードする方法がわかりませんでした。

ヘルパーはいますか?

4

2 に答える 2

2

すでに述べたように、decrypt変数を壊しています。ただし、「スクランブルされた」アルファベットから通常のアルファベットへのマッピングを適切に/まったく構築していません。

リストに対する基本的な繰り返しと単純なリスト関数 ( index()) 以外を使用せずに復号化すると、次のようになります。

cleartext = ""
for c in msg:
    if c in alphabet:
        pos = alphabet.index(c)
        cleartext += string.ascii_uppercase[pos]
    else:
        cleartext += c

コードにパッチを当てるだけでなく、改善の恩恵を受けることができます。これはおそらく宿題であり、おそらくここまで行くことは期待されていないと思いますが、とにかくそれを学ぶことに何の問題もありません.

  • 入力アルファベットに正当な値と見なされるもの (たとえば、この場合はおそらく AZ) のみが含まれていることを確認していないか、重複を確認していません。ユーザーは古いごみを入力して、そうでなければプログラムを壊す可能性があります。
  • あなたの印刷とループはあまり慣用的ではありません。
  • 関数は、コードを読みやすく保守しやすい部分に分割するのに適しています。
  • これは古い学校やペダンティックに見えるかもしれませんが、80 文字を超える行は Python の推奨スタイルではありません。隣接する文字列リテラル (例: "one""two") は結合されます (改行をまたがっても)。

あなたがせずにやっていることをしなければならない場合translate(以下を参照)、私は次のようなことをするかもしれません (ほんの簡単な例で、おそらく少しの作業で改善される可能性があります):

import string

def validate(alpha):
    # Is it exactly 26 characters long?
    if len(alpha) != 26: return False
    for c in alpha:
        # Is every character in [A-Z]?
        if c not in string.ascii_uppercase: return False
        # Is this character duplicated?
        if alpha.count(c) > 1: return False
    return True


alphabet = ""
while not validate(alphabet):
    alphabet = input("Please input the encryption alphabet in order (only A-Z"
                     " allowed, with no duplicates): ")

msg = input("Now input your encrypted message: ")

print("Your encrypted alphabet is:", alphabet)
print("Your encrypted message is:", msg)

# Create a mapping from one alphabet to the other using a dictionary
table = dict(zip(alphabet, string.ascii_uppercase))
cleartext = "".join([table[c] if c in table else c for c in msg])

print("Your decrypted message reads:", cleartext)

最後に、次のように、Python の組み込み文字列変換を使用してこれを行うこともできます。

import string
# read and validate alphabet
# read message
print(str.translate(message, str.maketrans(alphabet, string.ascii_uppercase)))
于 2013-08-16T05:54:44.060 に答える
1

スクランブルされたすべての文字を書き込んだ後、復号化を破壊しています。

crypt = ["*"] * 26
for s in range (26):
    val = decrypt[s] - 65
    crypt[val] = (s + 65)
于 2013-08-16T04:29:06.727 に答える