10 / 59 / 21
Регистрация: 12.03.2017
Сообщений: 514

Реализация шифра Цезаря

18.01.2018, 20:43. Показов 114028. Ответов 11
Метки нет (Все метки)

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

В функцию передается сообщение и сдвиг алфавита. Если сдвиг не указан, то пусть ваша функция кодирует сдвиг алфавита на 3 позиции:

А→Г,
Б→Д,
В→Е,

Э→А,
Ю→Б,
Я→В

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

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

Пример
Ввод
Да здравствует салат Цезарь!
3
Вывод
Зг кзугефхецих фгогх Щикгуя!
Да здравствует салат Цезарь!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.01.2018, 20:43
Ответы с готовыми решениями:

Реализация шифра DES на Python
Помогите исправить ошибки в коде, пожалуйста. class Des: import random StartPermutationTable = ...

Реализация шифра Цезаря - не могу записать в файл\из файла
Есть такая программа, найденная на просторах интернета Реализация шифра Цезаря # -*- coding: utf-8 -*- i_text =...

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

11
97 / 97 / 38
Регистрация: 30.11.2017
Сообщений: 180
18.01.2018, 23:06
Лучший ответ Сообщение было отмечено Pavlin234 как решение

Решение

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
llst = ['а','б','в','г','д','е','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я']
blst = ['А','Б','В','Г','Д','Е','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я']
 
 
def encryptCaesar(msg, shift=3):
    ret = ""
    for x in msg:
        if x in llst:
            ind = llst.index(x)
            ret += llst[ind+shift]
        elif x in blst:
            ind = blst.index(x)
            ret += blst[ind+shift]
        else:
            ret += x
    return ret
 
def decryptCaesar(msg, shift=3):
    ret = ""
    for x in msg:
        if x in llst:
            ind = llst.index(x)
            ret += llst[ind-shift]
        elif x in blst:
            ind = blst.index(x)
            ret += blst[ind-shift]
        else:
            ret += x
    return ret
 
print(encryptCaesar("Да здравствует салат Цезарь!"))
print(decryptCaesar("Зг кзугефхецих фгогх Щикгуя!"))
4
10 / 59 / 21
Регистрация: 12.03.2017
Сообщений: 514
21.01.2018, 17:42  [ТС]
Ввод должен быть из двух частей:
Вводится print(encryptCaesar("Да здравствует салат Цезарь!"))
А затем число shift! Оно может быть 3, 6, 73 и даже 0
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
22.01.2018, 19:10
Лучший ответ Сообщение было отмечено Pavlin234 как решение

Решение

Zedta,
Алфавит можно и без перечисления создать:
Python
1
2
3
4
5
6
7
8
9
# в виде списка  (ё\Ё по умолчанию нет)
lower_cyrillic = [chr(i) for i in range(ord('а'), ord('я') + 1)]
#lower_cyrillic.insert(6,'ё')
upper_cyrillic = [chr(i) for i in range(ord('А'), ord('Я') + 1)]
#upper_cyrillic.insert(6,'Ё')
 
# или в виде строки  (ё\Ё по умолчанию нет)
lower_cyrillic = ''.join(map(chr, range(ord('а'), ord('я') + 1)))
upper_cyrillic = ''.join(map(chr, range(ord('А'), ord('Я') + 1)))
Ну и сам шифр в python удобнее делать через таблицу трансляции:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def alphabet(shift):
    return lower_cyrillic[shift:] + \
           lower_cyrillic[:shift] + \
           upper_cyrillic[shift:] + \
           upper_cyrillic[:shift] 
     
def coding(typ="enc",shift=3):
    a1 = lower_cyrillic + upper_cyrillic
    a2 = alphabet(shift)
    
    t = {
        "enc":str.maketrans(a1,a2),
        "dec":str.maketrans(a2,a1)
        }
        
    return t[typ]     
        
print("Да здравствует салат Цезарь!".translate(coding("enc")))
print("Зг кзугефхецих фгогх Щикгуя!".translate(coding("dec")))
#Зг кзугефхецих фгогх Щикгуя!
#Да здравствует салат Цезарь!
1
97 / 97 / 38
Регистрация: 30.11.2017
Сообщений: 180
22.01.2018, 20:54
Garry Galler, главная проблема моего кода, все таки, то что к индексу прибавляются значения без всяких приверок и то, что он сработал это просто случайность.

В вашем варианте сделано красиво, но что работает только до сдвига 31.
1
10 / 59 / 21
Регистрация: 12.03.2017
Сообщений: 514
22.01.2018, 21:05  [ТС]
Да, вот полное решение:
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
llst = ['а','б','в','г','д','е','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я']
blst = ['А','Б','В','Г','Д','Е','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я']
 
 
def encryptCaesar(msg, shift):
    ret = ""
    for x in msg:
        if x in llst:
            ind = llst.index(x)%len(llst)
            ret += llst[(ind+shift)%len(llst)]
        elif x in blst:
            ind = blst.index(x)%len(llst)
            ret += blst[(ind+shift)%len(llst)]
        else:
            ret += x
    return ret
 
def decryptCaesar(msg, shift):
    ret = ""
    for x in msg:
        if x in llst:
            ind = llst.index(x)
            ret += llst[ind-shift]
        elif x in blst:
            ind = blst.index(x)
            ret += blst[ind-shift]
        else:
            ret += x
    return ret
 
#print(encryptCaesar("Да здравствует салат Цезарь!", 3))
#print(decryptCaesar("Зг кзугефхецих фгогх Щикгуя!", 3))
Спасибо, Garry Galler и Zedta

Добавлено через 6 минут
Garry Galler и Zedta, помогите, пожалуйста решить вот эти задачи:
https://www.cyberforum.ru/pyth... 76468.html
Функция, которая принимает в качестве аргумента функцию
Лямбда-выражение, чтобы transformed_values получился копией values
Коллбэки
https://www.cyberforum.ru/pyth... 78210.html
https://www.cyberforum.ru/pyth... 78213.html
2
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
22.01.2018, 21:28
Цитата Сообщение от Zedta Посмотреть сообщение
работает только до сдвига 31
При сдвиге на 32 (мощность алфавита) получаем исходный алфавит - тут все логично.
Чтобы работало и при сдвигах более 32 - можно изменить функцию создания алфавита на такую:

Python
1
2
3
4
5
6
def alphabet(shift):
    shift = shift % len(lower_cyrillic)
    return lower_cyrillic[shift:] + \
           lower_cyrillic[:shift] + \
           upper_cyrillic[shift:] + \
           upper_cyrillic[:shift]
Таким образом, при сдвиге на 35 (32 + 3) получаем тот же алфавит, что и на 3:
Python
1
2
3
4
print("Да здравствует салат Цезарь!".translate(coding("enc",35)))
print("Зг кзугефхецих фгогх Щикгуя!".translate(coding("dec",35)))
#Зг кзугефхецих фгогх Щикгуя!
#Да здравствует салат Цезарь!
Вроде правильно... хотя могу ошибаться.
2
10 / 59 / 21
Регистрация: 12.03.2017
Сообщений: 514
22.01.2018, 21:34  [ТС]
У меня прошло все до единого теста!
1
1 / 0 / 1
Регистрация: 11.01.2020
Сообщений: 20
11.05.2020, 15:35
скинешь код плиз?
0
8 / 8 / 0
Регистрация: 27.11.2021
Сообщений: 28
28.04.2022, 08:23
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
count = 0
 
 
def encrypt_caesar(msg, shift=3):
    big_lett, small_lett = '', ''
    if (count != 0 and shift <= 0) or (count == 0 and shift >= 0):
        if shift < 0:
            shift *= (-1)
        big_lett = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
        small_lett = 'абвгдежзийклмнопрстуфхцчшщъыьэюя'
    elif count != 0 or (shift <= 0 and count == 0):
        if shift < 0:
            shift *= (-1)
        big_lett = 'ЯЮЭЬЫЪЩШЧЦХФУТСРПОНМЛКЙИЗЖЕДГВБА'
        small_lett = 'яюэьыъщшчцхфутсрпонмлкйизжедгвба'
    mess, res, alph = list(msg), [], ' '
    for el in mess:
        if not el.isalpha():
            res.append(el)
        else:
            if el.isupper():
                alph = big_lett
            elif el.islower():
                alph = small_lett
            new_ind = alph.index(el) + shift
            if shift > 32:
                a = (32 * (new_ind // 32))
                res.append(alph[new_ind - (32 * (new_ind // 32))])
            else:
                if new_ind > 31:
                    res.append(alph[new_ind - 32])
                else:
                    res.append(alph[new_ind])
    return ''.join(res)
 
 
def decrypt_caesar(msg, shift=3):
    global count
    count = 1
    return encrypt_caesar(msg, shift)
Абсолютно долбанутое решение, но работает с любым shift и проходит любые тесты. Наслаждайтесь, если можно так выразиться )))
1
0 / 0 / 0
Регистрация: 10.05.2022
Сообщений: 1
10.05.2022, 21:38
def encrypt_caesar(msg, shift=3):
small_symbols1 = "абвгдежзийклмнопрстуфхцчшщъыьэюя"
big_symbols1 = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
shift = shift % len(small_symbols1)
small_symbols2 = small_symbols1[shift:] + small_symbols1[:shift]
big_symbols2 = big_symbols1[shift:] + big_symbols1[:shift]
translation = msg.maketrans(small_symbols1 + big_symbols1, small_symbols2 + big_symbols2)
return msg.translate(translation)


def decrypt_caesar(msg, shift=3):
return encrypt_caesar(msg, -1 * shift)

Добавлено через 36 секунд
Python
1
2
3
4
5
6
7
8
9
10
11
12
def encrypt_caesar(msg, shift=3):
    small_symbols1 = "абвгдежзийклмнопрстуфхцчшщъыьэюя"
    big_symbols1 = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
    shift = shift % len(small_symbols1)
    small_symbols2 = small_symbols1[shift:] + small_symbols1[:shift]
    big_symbols2 = big_symbols1[shift:] + big_symbols1[:shift]
    translation = msg.maketrans(small_symbols1 + big_symbols1, small_symbols2 + big_symbols2)
    return msg.translate(translation)
 
 
def decrypt_caesar(msg, shift=3):
    return encrypt_caesar(msg, -1 * shift)
Добавлено через 35 секунд
Это 100% рабочий код
0
0 / 0 / 0
Регистрация: 17.05.2024
Сообщений: 1
17.05.2024, 14:18
у меня прошел все проверки
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.05.2024, 14:18
Помогаю со студенческими работами здесь

Реализация шифра гаммирования
Помогите разобраться) Нужно написать реализацию шифра гаммирования. Как я это себе представляю: 1)Есть русский алфавит 33 символа ...

Реализация шифра Гронсфельда.
Реализация шифра Гронсфельда. Реализация модифицированного шифра Гронсфельда.

Реализация шифра Чейза на Питоне
Искал везде вот нету шифрование с методом Чейза только один вариант нашел на С++ и то он не работает. Если кто сможет если есть люди...

Реализация шифра Виженера на Python с применением Visual Studio 2019: ошибка записи результата в файл
Доброе утро! Я написал шифр Виженера для русского алфавита и получил ошибку при записи результата из файла. Сможете указать, как исправить...

Реализация шифра Цезаря
#include &lt;vcl.h&gt; #pragma hdrstop #include &lt;math.h&gt; #include &quot;Unit1.h&quot; ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru