簡體   English   中英

帶有字符串和for循環Python的Caesar Cipher算法

[英]Caesar Cipher algorithm with strings and for loop Python

任務是編寫一個接收2個參數的Caesar Cipher算法,第一個參數是String參數,第二個參數告訴您將字母移動多遠。 第一部分是設置方法並設置兩個字符串,一個為普通字符串,另一個為移位字符串。 我已經做到了。 然后,我需要做一個循環,通過找到原始字母並從移位后的字符串中選擇適當的新字母,來遍歷原始字符串以構建新字符串。 我已經花了至少兩個小時盯着這個,並與我的老師交談,所以我知道我做對了一些事情。 但是關於while循環中發生的事情,我真的沒有任何頭緒。 朝正確方向的任何提示或推動都將非常有幫助,因此,至少我有一個起點可以很好,謝謝。

def cipher(x, dist):
    alphabet = "abcdefghijklmnopqrstuvwxyz"
    shifted = "xyzabcdefghijklmnopqrstuvw"
    stringspot = 0
    shiftspot = (x.find("a"))
    aspot = (x.find("a"))
    while stringspot < 26:
        aspot = shifted(dist)
        shifted = 
        stringspot = stringspot + 1
        ans = 
    return ans

print(cipher("abcdef", 1))
print(cipher("abcdef", 2))
print(cipher("abcdef", 3))
print(cipher("dogcatpig", 1))

以下是一些提示和提示:

  1. 您應該驗證您的輸入。 特別是,請確保換檔距離是“合理的”,在合理的范圍內您可以處理。 我建議<= 25。

  2. 如果最大移位量為25,則字母“ a”加25將得到“ z”。 字母“ z”加25將超過字母的末尾。 但這不會超過兩個字母的結尾。 因此,這是處理環繞的一種方法。

  3. 用戶@zondo在他的解決方案中處理大寫字母。 您沒有提及是否要處理它們。 您可能需要與您的老師進行澄清。

  4. 如果您了解字典,則可能需要構建一個字典,以使將舊字母映射到新字母變得容易。

  5. 您需要認識到字符串被視為元組或列表-您可以對其進行索引。 我看不到您在代碼中這樣做。

  6. 您可以使用ord()獲得字母的“ ASCII碼”數字。 這些數字是任意的,但是大寫和小寫數字在26的范圍內緊密組合在一起。這意味着您可以使用它們進行數學運算。 (例如, ord('a')為97。不是超級有用。但是ord('b') - ord('a')為1,這也許是個好消息。)

alphabetshifted應該被認為是原始流和密文之間的映射。 循環的工作是遍歷流中的所有字母替換它們。 更具體地,字母中的alphabetshifted的替代字母位於相同的索引處,因此是映射。 用偽代碼:

ciphertext = empty
for each letter in x
    i = index of letter in alphabet
    new_letter = shifted[i]
    add new_letter to ciphertext

整個循環可以簡化為一個理解列表,但這不是您的主要關注點。

與上面的偽代碼中的操作相比,要進行更直接的映射,請查看詞典。

在代碼中突出的另一件事是shifted的生成,該代碼應取決於dist參數,因此不能僅對其進行硬編碼。 因此,如果dist為5,則shifted的第一個字母應為alphabet 0 + 5處的任意值,依此類推。 提示:模運算符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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