Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 02.03.2025
Сообщений: 3

Шифр Цезаря

12.03.2025, 22:43. Показов 2995. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Напишите функцию encrypt_caesar(msg, shift), которая кодирует сообщение шифром Цезаря и возвращает его. Шифр Цезаря заменяет каждую букву в тексте на букву, которая отстоит в алфавите на некоторое фиксированное число позиций.
В функцию передается сообщение и сдвиг алфавита. Если сдвиг не указан, то пусть ваша функция кодирует сдвиг алфавита на 3 позиции:

А→Г, Б→Д, В→Е, … Э→А, Ю→Б, Я→В

Все символы, кроме русских букв должны остаться неизменными. Маленькие буквы должны превращаться в маленькие, большие — в большие.

Напишите также функцию декодирования decrypt_caesar(msg, shift), также использующую сдвиг по умолчанию. При написании функции декодирования используйте вашу функцию кодирования.

Пример 1

Ввод

Python
1
2
3
4
5
6
msg = "Да здравствует салат Цезарь!"
shift = 3
encrypted = encrypt_caesar(msg, shift)
decrypted = decrypt_caesar(encrypted, shift)
print(encrypted)
print(decrypted)
Вывод

Зг кзугефхецих фгогх Щикгуя!
Да здравствует салат Цезарь!

Пример 2

Ввод

Python
1
2
3
4
5
6
msg = "Да здравствует салат Цезарь!"
shift = 5
encrypted = encrypt_caesar(msg, shift)
decrypted = decrypt_caesar(encrypted, shift)
print(encrypted)
print(decrypted)
Вывод

Йе мйхезцчзшкч цереч Ыкмехб!
Да здравствует салат Цезарь!

Примечания
Символы русского алфавита расположены в стандартной для Python таблице кодировки подряд, то есть номера, выдаваемые функцией ord(symbol), идут подряд.
Буква «ё» идёт в таблице кодировки отдельно от основного алфавита. При решении задачи считайте, что буквы «ё» в русском алфавите нет.

Бился, бился, но ничего сносного так и не придумал. Помогите кому не сложно, буду признателен!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.03.2025, 22:43
Ответы с готовыми решениями:

Шифр Цезаря
Как сделать шифрование шифром Цезаря, я сделал так(ключ взял 13): s1="" for i in text: if...

Шифр Цезаря
Саму задачу сделал, но выводится все без пробелов. К примеру, вводим строку 'In a hole in the...

Шифр Цезаря рамки для алфавита
Как сделать "рамки" для программы что бы она не выходила из алфавита заглавных букв ASC2(65-90)? ...

9
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
13.03.2025, 06:57
Цитата Сообщение от McSSS Посмотреть сообщение
Бился, бился, но ничего сносного так и не придумал.
- пролистай страницу вниз до конца и посмотри, сколько раз решена эта задача
0
93 / 88 / 17
Регистрация: 05.08.2021
Сообщений: 418
07.10.2025, 13:15
Да, многие с этим шифром Цезаря баловались... Я тоже решил не отставать от общего веселья. Сказали что правильно, исключая того что не учитывается буква Ё
Python
1
2
3
4
5
6
7
8
9
10
11
n = int(input('Сдвиг на '))
rus = [chr(i) for i in range(ord('а'),ord('я') + 1)]
caes = rus[n:] + rus[:n]
word = input().lower()
res = ''
for i in range(len(word)):
    if word[i] == ' ':
        res += ' '
    else:    
        res += caes[rus.index(word[i])]
print(res.capitalize())
Сдвиг на 3
Да здравствует салат Цезарь
Зг кзугефхецих фгогх щикгуя

Ну а дешифровка обратно соответственно ввод того же сдвига с отрицательным значением
0
 Аватар для andrey_f
883 / 536 / 228
Регистрация: 21.02.2011
Сообщений: 5,706
13.10.2025, 13:21
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def encrypt_caesar(msg, shift):
    return ''.join(
        chr((ord(c) - 1040 + shift) % 32 + 1040) if 'А' <= c <= 'Я' else
        chr((ord(c) - 1072 + shift) % 32 + 1072) if 'а' <= c <= 'я' else c
        for c in msg
    )
 
def decrypt_caesar(msg, shift):
    return encrypt_caesar(msg, -shift)
    
msg = "Да здравствует салат Цезарь!"    
shift = 5
encrypted = encrypt_caesar(msg, shift)
decrypted = decrypt_caesar(encrypted, shift)
print(encrypted)
print(decrypted)
1
Эксперт Python
8840 / 4492 / 1864
Регистрация: 27.03.2020
Сообщений: 7,312
13.10.2025, 20:13
translate(str.maketrans(rus, rus[n:] + rus[:n]))
1
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,304
14.10.2025, 10:46
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class CaesarCipher:
    def __init__(self):
        # Создаем словари для русского и английского алфавита  
        self.rus_lower = 'абвгдежзийклмнопрстуфхцчшщъыьэюя'
        self.rus_upper = self.rus_lower.upper()
        self.eng_lower = 'abcdefghijklmnopqrstuvwxyz'
        self.eng_upper = self.eng_lower.upper()
 
    def encrypt(self, text, shift):
        result = []
 
        for char in text:
            if char in self.rus_lower:
                index = (self.rus_lower.index(char) + shift) % 32
                result.append(self.rus_lower[index])
            elif char in self.rus_upper:
                index = (self.rus_upper.index(char) + shift) % 32
                result.append(self.rus_upper[index])
            elif char in self.eng_lower:
                index = (self.eng_lower.index(char) + shift) % 26
                result.append(self.eng_lower[index])
            elif char in self.eng_upper:
                index = (self.eng_upper.index(char) + shift) % 26
                result.append(self.eng_upper[index])
            else:
                result.append(char)  # Не алфавитные символы остаются без изменений  
 
        return ''.join(result)
 
    def decrypt(self, text, shift):
        # Для расшифровки используем отрицательное смещение  
        return self.encrypt(text, -shift)
 
    # Пример использования:
 
 
cipher = CaesarCipher()
 
# Русский текст  
text_ru = input()
shift = 3
 
encrypted_ru = cipher.encrypt(text_ru, shift)
decrypted_ru = cipher.decrypt(encrypted_ru, shift)
 
print(f"Исходный текст: {text_ru}")
print(f"Зашифрованный: {encrypted_ru}")
print(f"Расшифрованный: {decrypted_ru}")
0
0 / 0 / 0
Регистрация: 14.10.2025
Сообщений: 1
14.10.2025, 23:33
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
def encrypt_caesar(msg: str, shift):
    ru_dict = "абвгдежзийклмнопрстуфхцчшщъыьэюя"
    text = ""
    for y in msg:
        if y.isupper():
            symbol = ru_dict.find(y.lower())
            if symbol <= len(ru_dict) - 1 - shift:
                m = ru_dict[symbol + shift]
                text += m.upper()
            else:
                lenght = symbol - len(ru_dict) + shift
                text += ru_dict[lenght].upper()
        elif y.islower():
            symbol = ru_dict.find(y)
            if symbol <= len(ru_dict) - 1 - shift:
                text += ru_dict[symbol + shift]
            else:
                lenght = symbol - len(ru_dict) + shift
                text += ru_dict[lenght]
        else:
            text += y
            
                
    return text
 
 
def decrypt_caesar(msg: str, shift):
    
    ru_dict = "абвгдежзийклмнопрстуфхцчшщъыьэюя"
    text = ""
    
    for i in msg:
        if i.isupper():
            symbol = ru_dict.find(i.lower())
            index = symbol - shift
            text += ru_dict[index].upper()
        elif i.islower():
            symbol = ru_dict.find(i)
            index = symbol - shift
            text += ru_dict[index]
        else:
            text += i
 
    return text
lol = encrypt_caesar("Да здравствует салат Цезарь!", 5)
print(decrypt_caesar(lol, 5))
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,304
15.10.2025, 17:12
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
def encrypt_caesar(msg: str, shift):
    ru_dict = "абвгдежзийклмнопрстуфхцчшщъыьэюя"
    en_dict = "abcdefghijklmnopqrstvwxyz"
    text = ""
    for y in msg:
        if y.isupper():
            symbol = ru_dict.find(y.lower())
            if symbol <= len(ru_dict) - 1 - shift:
                m = ru_dict[symbol + shift]
                text += m.upper()
            else:
                lenght = symbol - len(ru_dict) + shift
                text += ru_dict[lenght].upper()
            symbol = en_dict.find(y.lower())
            if symbol <= len(en_dict) - 1 - shift:
                m = en_dict[symbol + shift]
                text += m.upper()
            else:
                lenght = symbol - len(en_dict) + shift
                text += en_dict[lenght].upper()
        elif y.islower():
            symbol = ru_dict.find(y)
            if symbol <= len(ru_dict) - 1 - shift:
                text += ru_dict[symbol + shift]
            else:
                lenght = symbol - len(ru_dict) + shift
                text += ru_dict[lenght]
 
            symbol = en_dict.find(y)
            if symbol <= len(en_dict) - 1 - shift:
                text += en_dict[symbol + shift]
            else:
                lenght = symbol - len(en_dict) + shift
                text += en_dict[lenght]
 
        else:
            text += y
 
            return text
 
 
 
 
 
def decrypt_caesar(msg: str, shift):
    ru_dict = "абвгдежзийклмнопрстуфхцчшщъыьэюя"
    en_dict = "abcdefghijklmnopqrstvwxyz"
    text = ""
 
    for i in msg:
        if i.isupper():
            symbol = ru_dict.find(i.lower())
            index = symbol - shift
            text += ru_dict[index].upper()
        elif i.islower():
            symbol = ru_dict.find(i)
            index = symbol - shift
            text += ru_dict[index]
        else:
            text += i
 
        if i.isupper():
            symbol = en_dict.find(i.lower())
            index = symbol - shift
            text += en_dict[index].upper()
        elif i.islower():
            symbol = en_dict.find(i)
            index = symbol - shift
            text += en_dict[index]
        else:
            text += i
 
    return text
 
 
str = input()
print(decrypt_caesar(str, 5))
Добавлено через 5 часов 25 минут
Вот еще:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
def encrypt_caesar(msg: str, shift):
    ru_dict = "абвгдежзийклмнопрстуфхцчшщъыьэюя"
    en_dict = "abcdefghijklmnopqrstvwxyz"
    text = ""
    for y in msg:
        if y.isupper():
            symbol = ru_dict.find(y.lower())
            if symbol <= len(ru_dict) - 1 - shift:
                m = ru_dict[symbol + shift]
                text += m.upper()
            else:
                lenght = symbol - len(ru_dict) + shift
                text += ru_dict[lenght].upper()
            symbol = en_dict.find(y.lower())
            if symbol <= len(en_dict) - 1 - shift:
                m = en_dict[symbol + shift]
                text += m.upper()
            else:
                lenght = symbol - len(en_dict) + shift
                text += en_dict[lenght].upper()
        elif y.islower():
            symbol = ru_dict.find(y)
            if symbol <= len(ru_dict) - 1 - shift:
                text += ru_dict[symbol + shift]
            else:
                lenght = symbol - len(ru_dict) + shift
                text += ru_dict[lenght]
 
            symbol = en_dict.find(y)
            if symbol <= len(en_dict) - 1 - shift:
                text += en_dict[symbol + shift]
            else:
                lenght = symbol - len(en_dict) + shift
                text += en_dict[lenght]
 
        else:
            text += y
 
            return text
 
 
def decrypt_caesar(msg: str, shift):
    return encrypt_caesar(msg, -shift)
 
 
 
 
 
st = input("Введите текст: ")
shift = int(input("Введите сдвиг: "))
 
encrypted = encrypt_caesar(st, shift)
decrypted = decrypt_caesar(encrypted, -shift)
 
print(f"Зашифровано: {encrypted}")
print(f"Расшифровано: {decrypted}")
Только к сожалению не выходит обратная расшифровка к исходному введеному тексту????
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,304
16.10.2025, 15:52
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
def caesar_cipher(text, shift, mode='encrypt'):
    result = []
 
    for char in text:
        # Обработка кириллицы  
        if 'А' <= char <= 'Я' or 'а' <= char <= 'я':
            start = 'А' if char.isupper() else 'а'
            offset = ord(start)
            result.append(chr((ord(char) - offset + shift * (1 if mode == 'encrypt' else -1)) % 32 + offset))
 
            # Обработка латиницы
        elif 'A' <= char <= 'Z' or 'a' <= char <= 'z':
            start = 'A' if char.isupper() else 'a'
            offset = ord(start)
            result.append(chr((ord(char) - offset + shift * (1 if mode == 'encrypt' else -1)) % 26 + offset))
 
            # Неалфавитные символы остаются без изменений
        else:
            result.append(char)
 
    return ''.join(result)
 
 
# Пример использования
original_text = input()
shift_value = int(input())
 
# Шифрование  
encrypted_text = caesar_cipher(original_text, shift_value, 'encrypt')
print(f"Зашифрованный текст: {encrypted_text}")
 
# Дешифрование  
decrypted_text = caesar_cipher(encrypted_text, shift_value, 'decrypt')
print(f"Расшифрованный текст: {decrypted_text}")
0
 Аватар для Aviz__
2736 / 2046 / 506
Регистрация: 17.02.2014
Сообщений: 9,462
16.10.2025, 19:24
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
from abc import ABC, abstractmethod
 
 
class CipherInterface(ABC):
    @abstractmethod
    def encrypt(self,  str) -> str:
        """
        Шифрует строку и возвращает зашифрованную строку.
        """
        pass
 
    @abstractmethod
    def decrypt(self,  str) -> str:
        """
        Расшифровывает строку и возвращает исходную строку.
        """
        pass
 
 
class CaesarCipher(CipherInterface):
    def __init__(self, shift: int):
        """
        Инициализирует шифр Цезаря с заданным смещением.
        Смещение может быть положительным или отрицательным.
        Работает с любыми Unicode-буквами и цифрами.
        """
        self.shift = shift
 
    def _shift_char(self, char: str, shift: int) -> str:
        if char.isdigit():
            # Сдвигаем цифры
            start_code = ord('0')
            code = ord(char)
            new_code = start_code + (code - start_code + shift) % 10
            return chr(new_code)
        elif char.isalpha():
            # Сдвигаем буквы
            is_upper = char.isupper()
            lower_char = char.lower()
            start_code = self._get_alphabet_start(lower_char)
            if start_code is not None:
                new_code = start_code + (ord(lower_char) - start_code + shift) % 26
                new_char = chr(new_code)
            else:
                # Если не удалось определить алфавит, оставляем символ без изменений
                new_char = lower_char
            return new_char.upper() if is_upper else new_char
        else:
            # Не буква и не цифра — оставляем без изменений
            return char
 
    @staticmethod
    def _get_alphabet_start(char: str) -> int | None:
        """
        Возвращает начальный код ASCII-алфавита, к которому принадлежит символ.
        """
        if 'a' <= char <= 'z':
            return ord('a')
        elif 'а' <= char <= 'я':  # русская кириллица
            return ord('а')
        elif 'А' <= char <= 'Я':  # русская кириллица
            return ord('А')
        elif 'A' <= char <= 'Z':
            return ord('A')
        else:
            return None
 
    def encrypt(self, data: str) -> str:
        result = []
        for char in data:
            result.append(self._shift_char(char, self.shift))
        return ''.join(result)
 
    def decrypt(self, data: str) -> str:
        # Для расшифровки используем обратное смещение
        temp_shift = self.shift
        self.shift = -temp_shift
        decrypted = self.encrypt(data)
        self.shift = temp_shift
        return decrypted
 
 
class CipherManager:
    def __init__(self, cipher: CipherInterface):
        self.cipher = cipher
 
    def encrypt_data(self, data: str) -> str:
        return self.cipher.encrypt(data)
 
    def decrypt_data(self,data: str) -> str:
        return self.cipher.decrypt(data)
 
 
if __name__ == "__main__":
    shift = int(input("Enter Caesar cipher shift: "))
    cipher = CaesarCipher(shift)
    manager = CipherManager(cipher)
 
    text = "Hello123, Привет456, Gruß789, café0! 987"
    print(f"Original: {text}")
 
    encrypted = manager.encrypt_data(text)
    print(f"Encrypted: {encrypted}")
 
    decrypted = manager.decrypt_data(encrypted)
    print(f"Decrypted: {decrypted}")
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.10.2025, 19:24
Помогаю со студенческими работами здесь

Шифр Цезаря через Python
Доброго времени суток. Необходимо написать программу на Питоне с простеньким графическим...

Шифр Цезаря
Написал такой код для шифра цезаря, как его можно оптимизировать, написать покрасивее: word =...

Шифр Цезаря Python
Допустим, мне надо зашифровать 2 слова, написанные через пробел: hello world Программа выдает:...

Шифр Цезаря
Ограничение времени 1 секунда Ограничение памяти 64Mb Ввод стандартный ввод или input.txt...

Вывести 20 первых чисел фиббоначии шифр цезаря
Вывести первых 20 чисел фиббоначи и реализовать шифр цезаря


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru