Задать вопрос
@yoyyy

Шифр Виженера, как можно сделать лучше код?

В программировании я новичок, но захотелось сделать собственный код для шифра Виженера. Видел другие варианты кода, но мало что в них понял, поэтому сделал по-своему. Скажите, что можно исправить здесь, чтобы сократить или оптимизировать сам код?
import textwrap
#c-шиф символ n-алфавит k-ключ m-исх номер
alf_ru = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
alf_rum = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
a=input(('Ввееди фразу: '))
key=input(('Слово: '))
act=str(input('1 - шиф, 2 - дешиф: '))

def shifr(sh):
    n=33
    result=''
    for i in range (len(a)):
        if a[i] in alf_rum:
            ish=a[i]
            kl=key[i]
            m=alf_rum.find(ish)
            k=alf_rum.find(kl)
            c=(m+k)%n
            result+=alf_rum[c]
        elif a[i] in alf_ru:
            ish = a[i]
            kl = key[i]
            m = alf_ru.find(ish)
            k = alf_rum.find(kl)
            c = (m + k) % n
            result+=alf_ru[c]
        else:
            result+=a[i]
    return result
def deshifr(sh):
    n=33
    result=''
    for i in range (len(a)):
        if a[i] in alf_rum:
            ish=a[i]
            kl=key[i]
            c=alf_rum.find(ish)
            k=alf_rum.find(kl)
            m=(c-k)%n
            result+=alf_rum[m]
        elif a[i] in alf_ru:
            ish = a[i]
            kl = key[i]
            c = alf_ru.find(ish)
            k = alf_rum.find(kl)
            m=(c-k)%n
            result+=alf_ru[m]
        else:
            result+=a[i]
    return result

empt=[]
for i in range(len(a)):
    if a[i]==' ':
        empt.append(i)
a=a.replace(' ','')
#print('1)', a, empt )
simb=[]
znaki=[]

for i in range(len(a)):
    if a[i] not in alf_rum and a[i] not in alf_ru:
        simb.append(i)
        znaki.append(a[i])
    else:
        continue
#print('2)', a, simb, znaki)

while len(a)!=len(key):
    for i in range(0,len(key)):
        if len(a)!=len(key):
            key+=key[i]

for i in range(len(simb)):
    pos=simb[i]
    key=key[:pos]+znaki[i]+key[pos:]
key=key[:len(a)]
#print('3)', key)



move={
    '1': shifr,
    '2': deshifr,
}
res=move.get(act)(act)
for i in range(len(empt)):
    pro=empt[i]
    res=res[:pro]+' '+res[pro:]

print(textwrap.fill(res, 157))
  • Вопрос задан
  • 131 просмотр
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
LaRN
@LaRN
Senior Developer
Если передать на вход действие не 1 и не 2, то все упадет с ошибкой, т.к. функция в словаре move не будет найдена.

Использовать глобальные переменные это антипаттерн. Я про переменные key и a. Их можно было бы передать как параметры.

Для определения кода буквы можно использовать функцию ord и тогда не нужно будет пользоваться списком символов для вычисления индекса символа.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
26 дек. 2024, в 14:50
2000 руб./за проект
26 дек. 2024, в 14:40
15000 руб./за проект
26 дек. 2024, в 14:27
100000 руб./за проект