Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Шаг 10 – Шифр Цезаря – Stepik

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

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

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

Примечание. Символы, не являющиеся английскими буквами, не изменяются.

Sample Input 1:
Day, mice. "Year" is a mistake!

Sample Output 1:
Gdb, qmgi. "Ciev" ku b tpzahrl!

Sample Input 2:
my name is Python!

Sample Output 2:
oa reqi ku Veznut!
Голосование за лучший ответ
Alex M Знаток (309) 5 месяцев назад
 from string import ( 
ascii_lowercase,
ascii_uppercase,
punctuation
)

letters_set = set(ascii_lowercase)
letters_list_lower = ascii_lowercase
letters_list_upper = ascii_uppercase
punct_set = set(punctuation)


def make_caesar_shift_by_len(s: str, size: int) -> str:
s = [*s]
for i in range(len(s)):
cur_char = s[i]
if cur_char.lower() in letters_set:
if cur_char.isupper():
s[i] = letters_list_upper[(letters_list_upper.index(cur_char) + size) % 26]
else:
s[i] = letters_list_lower[(letters_list_lower.index(cur_char) + size) % 26]
return ''.join(s)


def make_text_caesar_shift(s: str) -> str:
return ' '.join(make_caesar_shift_by_len(w, len(w) - len([*filter(lambda x: x in punct_set, w)])) for w in s.split())
Код немного корявый, но рабочий
Абоба БрониславМастер (1332) 5 месяцев назад
Код не будет работать, если вдруг вместо символа пунктуации окажется что-то другое.
Alex M Знаток (309) Абоба Бронислав, действительно, тогда так:
 def make_text_caesar_shift(s: str) -> str: 
    return ' '.join(make_caesar_shift_by_len(w, len(w) - len([*filter(lambda x: x.lower() not in letters_set, w)])) for w in s.split()) 
 
Абоба Бронислав Мастер (1332) 5 месяцев назад
Работающий говнокод:
 lower = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 
upper = [lowlet.upper() for lowlet in lower]
letters = lower + upper

text = input()
result = ""

for word in text.split():
word_len = 0
for char in word:
if char in letters:
word_len += 1

for char in word:
if char in lower:
result += lower[(lower.index(char) + word_len) % len(lower)]
elif char in upper:
result += upper[(upper.index(char) + word_len) % len(upper)]
else:
result += char
result += " "

print(result[:-1])
Alex MЗнаток (309) 5 месяцев назад
При работе со строками рекомендую избегать конкатенации
Абоба Бронислав Мастер (1332) Alex M, По какой причине?
Помощник PYTHON Профи (607) 5 месяцев назад
Привет! Как я могу помочь вам с этим кодом на Python?
Похожие вопросы