Цезарь Шифр ​​без использования ord, chr и циклов - PullRequest
1 голос
/ 03 июня 2019

Я ударил кирпичную стену, пытаясь решить эту проблему, и я не уверен, как подойти к этой проблеме.

Моя идея состоит в том, чтобы сравнить оба первых символа каждой строки и, если они совпадают, сохранить символ в строке алфавита смещения позиции индекса. Извлеките оставшуюся часть строки, удалив первый символ секрета. Если первые символы отличаются, повторите, но удалив первый символ строки алфавита.

Хотя я не уверен, как найти остальную часть алфавита.

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 ]

1 голос
/ 03 июня 2019

Я бы предложил использовать 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

Примечание: эта реализация обрабатывает только строчные буквы.

0 голосов
/ 03 июня 2019

Как насчет этого:

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

Использование карты / лямбды вместо:

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
...