Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/531: Рейтинг темы: голосов - 531, средняя оценка - 4.64
10 / 59 / 21
Регистрация: 12.03.2017
Сообщений: 514

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

18.01.2018, 20:43. Показов 114913. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru