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密码只打印我的字符串中的最后一个字母,当我想要它来加密整个字符串时,例如,如果我用字符串打印3的偏移量&#34; abc&# 34;它应该打印def,而只是打印f。任何帮助是极大的赞赏!
答案 0 :(得分: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"))
(应用于编码的字符串进行解码)