Шифр Цезаря, английский алфавит

На вход программе подается строка текста на английском языке, в которой нужно зашифровать все слова. Каждое слово строки следует зашифровать с помощью шифра Цезаря (циклического сдвига на длину этого слова). Строчные буквы при этом остаются строчными, а прописные – прописными.

Формат входных данных На вход программе подается строка текста на английском языке.

Формат выходных данных Программа должна вывести зашифрованный текст в соответствии с условием задачи.

Примечание. Символы, не являющиеся английскими буквами, не изменяются. Ввод Day, mice. "Year" is a mistake! Вывод Gdb, qmgi. "Ciev" ku b tpzahrl! Мой код

def encrypt(text,s):
    result = ""
    for i in range(len(text)):
        char = text[i]
        if (char.isupper()):
            result += chr((ord(char) + s-65) % 26 + 65)
        else:
            result += chr((ord(char) + s - 97) % 26 + 97)
            return result
#check the above function
text = input().split()
s = 4

print (text)
print (str(s))
print(encrypt(text,s))

Ответы (1 шт):

Автор решения: nomnoms12

Вы пытаетесь обрабатывать слово как символ. Также Вы учитываете спец. символы при подсчёте длины слова. И return в блоке else.

Пример:

def encrypt(text: str) -> str:
    words = []

    for word in text.split():
        new_word = ''
        word_len = len([c for c in word if c.isupper() or c.islower()])

        for char in word:
            if char.isupper():
                new_word += chr((ord(char) + word_len - 65) % 26 + 65)
            elif char.islower():
                new_word += chr((ord(char) + word_len - 97) % 26 + 97)
            else:
                new_word += char
        words.append(new_word)

    return ' '.join(words)


text = 'Day, mice. "Year" is a mistake!'
print(encrypt(text))

stdout:

Gdb, qmgi. "Ciev" ku b tpzahrl!
→ Ссылка