2017-01-11 39 views
2
def caesar_cipher(offset, string): 
    words = string.replace(" ", " ") 
    cipher_chars = "abcdefghijklmnopqrstuvwxyz" 
    word_i = 0 
    while word_i < len(words): 
     word = words[word_i] 

     letter_i = 0 
     while letter_i < len(word): 
      char_i = ord(word[letter_i]) - ord("c") 
      new_char_i = (char_i + offset) % 26 
      value = chr(new_char_i + ord("c")) 
      letter_i += 1 
     word_i += 1 

    return words.join(value) 
print caesar_cipher(3, "abc") 

嘿大家,由於某種原因,我的ceasar密碼只打印我的字符串中的最後一個字母,當我想要它密碼整個字符串,例如,如果我打印字符串「abc」3的偏移量,它應該打印def,而只是打印f。任何幫助是極大的讚賞!爲什麼我的caeser密碼只能打印字符串的最後一個字母?蟒蛇

+1

什麼是與第2行空間的空間了?這應該是'words = string.split(「」)'? –

+0

你爲什麼要減去並添加'ord('c')'?這種方式'value'只能包含字符'c'to'z','{'和'|'。 (由於'0 <= new_char_i <= 25'。) –

+0

@RobinKoch我最初把它當作string.split,但是改成它來替換看看會做什麼。仍然是開發和算法的新手。 – Johnny

回答

2

value在循環中被覆蓋。要創建傳遞給join列表(ATM要加入只有1個字符):

value = [] 

然後

value.append(chr(new_char_i + ord("c"))) 

join說法也是錯誤的:只是做:

return "".join(value) 

請注意,您的代碼中還存在其他問題。它似乎意圖處理幾個單詞,但它沒有,所以很多循環不會循環(沒有單詞列表,它只是一個單詞),所以你在做什麼可以被總結爲(使用一個簡單的列表理解):

def caesar_cipher(offset, string): 
    return "".join([chr((ord(letter) - ord("c") + offset) % 26 + ord("c")) for letter in string]) 

和一個句子:

print(" ".join([caesar_cipher(3, w) for w in "a full sentence".split()])) 

作爲一個很好的評論者指出,使用c的,因爲它含有象垃圾一樣清除最後3個字母的句子開始信是不正確的。沒有理由不a啓動(結果都爲字母,其餘相同):

def caesar_cipher(offset, string): 
    return "".join([chr((ord(letter) - ord("a") + offset) % 26 + ord("a")) for letter in string]) 

旁白:一個快速的類似的算法是rot13。不是一個真正的密碼,但它本身支持:

import codecs 
print(codecs.encode("a full sentence","rot13")) 

(適用於編碼的字符串解碼)

+0

似乎工作,但現在打印dabceabcf其中有答案,但我試圖讓它只是打印定義如果字符串givin abc – Johnny

+0

仍然只是得到最後一個字母返回時定義在第一個循環中,但是當我打印價值時,它打印支架3次 – Johnny

+0

哦,我看到你在那裏做了什麼。謝謝你我還是新手來編寫代碼。 – Johnny

相關問題