凯撒密码,无需使用ord,chr和loops

时间:2019-06-03 02:12:24

标签: python python-3.x caesar-cipher

我碰壁试图解决这个问题,但不确定如何解决这个问题。

我的想法是比较每个字符串的前两个字符,如果它们相同,则将该字符保存在索引位置偏移的字母字符串中。  通过删除机密的第一个字符来递归其余字符串。如果前几个字符不同,请递归但删除字母字符串的第一个字符。

我不确定如何在其余字母中递归。

alphabet = "abcdefghijklmnopqrstuvwxyz"

def caesar_encrypt(secret, shift):
    if len(secret) == 0:
        return "" 
    elif shift == 0:
        return secret
    else:
        if secret[0] == alphabet[0]:           
            return alphabet[shift] + caesar_encrypt(secret[1:],shift)
        else:
            return caesar_encrypt(secret,shift), alphabet[1:]

2 个答案:

答案 0 :(得分:1)

我建议使用str.index查找字符串中每个字符在字母表中每个字符的索引。之后,使用它索引字母并递归。

您应该注意的一些陷阱:

  1. 如果字符串中包含空格,请将该字符串原样放置在字符串中,然后移至下一个字符

  2. 您需要处理环绕声,如果我们在字母的末尾并且您选择的偏移量超过了字母的末尾,则需要环绕并转到字母的开头。

这应该有效:

alphabet = "abcdefghijklmnopqrstuvwxyz"

def caesar_encrypt(secret, shift):
    if len(secret) == 0:
        return ""
    elif shift == 0:
        return secret
    elif secret[0] == ' ': # New - handle spaces
        return ' ' + caesar_encrypt(secret[1:], shift)
    else:
        index = (alphabet.index(secret[0]) + shift) % len(alphabet) # Find the right place to access the alphabet
        return alphabet[index] + caesar_encrypt(secret[1:], shift) # Use this new character then recurse

注意:此实现仅处理小写字母。

答案 1 :(得分:0)

如何?

def shift_alphabet(shift):
    return alphabet[shift:] + alphabet[:shift]

def caesar_encrypt(secret, shift):
    coded_alphabet = shift_alphabet(shift)
    coded = [coded_alphabet[alphabet.index(i)] for i in secret]
    coded = ''.join(coded)

    return coded

使用map / lambda代替:

def shift_alphabet(shift):
      return alphabet[shift:] + alphabet[:shift]

def encrypt_letter(letter, coded_alphabet):
      return coded_alphabet[alphabet.index(letter)]

def caesar_encrypt(secret, shift):
      coded_alphabet = shift_alphabet(shift)
      coded = map(lambda x: encrypt_letter(x, coded_alphabet), secret)
      coded = ''.join(coded)

      return coded