Python 2 Цезарь Шифр

63
5

Мой вопрос заключается в том, как улучшить код, чтобы он мог адаптироваться к любому длинному входному сообщению. Как есть, сообщение должно быть 5 букв. Я хотел бы улучшить код, чтобы можно было ввести сообщение любой длины, и шифр будет работать с ним. Помощь будет высоко оценена. :-) Смотрите код ниже!

#Enter your message
message=raw_input('Enter your message here. Make sure to use all CAPS througout your message and leave no spaces in between words.')
length=len(message)
print 'The length of your message is ',length

#This statement is a possible idea to let the program know how many letters it will be need to shift. But I don't know how to actually do this.
print chr(length+64)
#Indexes letters out of message.
A=message[length-length]
B=message[length-length+1]
C=message[length-length+2]
D=message[length-length+3]
E=message[length-length+4]

#Shifts letters and accounts for shifting XYZ to ABC.
def shift(x):
if ord(x)+3==91:
return 65
if ord(x)+3==92:
return 66
if ord(x)+3==93:
return 67
else:
return ord(x)+3

a2=shift(A)
b2=shift(B)
c2=shift(C)
d2=shift(D)
e2=shift(E)

#Converts shifted ordinals back to characters
def convert(x):
return chr(x)
first=convert(a2)
second=convert(b2)
third=convert(c2)
fourth=convert(d2)
fifth=convert(e2)

#Prints resultant characters
print first,second,third,fourth,fifth

спросил(а) 2021-01-25T17:35:04+03:00 4 месяца, 3 недели назад
1
Решение
76

import string
shift_amt = 13
alphabet_lc = string.ascii_lowercase
shifted_lc = alphabet_lc[shift_amt:]+alphabet_lc[:shift_amt]

alphabet_uc = alphabet_lc.upper()
shifted_uc = shifted_lc.upper()
trans_tab = string.maketrans(alphabet_lc+alphabet_uc,shifted_lc+shifted_uc)

message = "Encode Me To a new MessaGez!"
print message.translate(trans_tab)

это один из способов сделать это в Python2 по крайней мере

ответил(а) 2021-01-25T17:35:04+03:00 4 месяца, 3 недели назад
62

Цессарный шифр встроен в python 2;

In [6]: 'The Caesar cipher is built-in.'.encode('rot13')
Out[6]: 'Gur Pnrfne pvcure vf ohvyg-va.'

Как вы можете видеть, эта кодировка действует только на буквы, и она работает для верхнего и нижнего регистров.

Но вы хотите удалить пробелы и сделать все в верхнем регистре, Python тоже может это сделать;

In [9]: 'this is a string'.translate(None, ' \t')
Out[9]: 'thisisastring'

In [10]: 'this is a string'.translate(None, ' \t').upper()
Out[10]: 'THISISASTRING'

In [11]: 'this is a string'.translate(None, ' \t').upper().encode('rot13')
Out[11]: 'GUVFVFNFGEVAT'

Или по-другому;

In [15]: ''.join('this is a string'.split()).upper().encode('rot13')
Out[15]: 'GUVFVFNFGEVAT'

ответил(а) 2021-01-25T17:35:04+03:00 4 месяца, 3 недели назад
63

Используйте два for циклов, один для прокрутки каждого символа, и один для смещения символа желаемого количества раз. Мы используем функцию upper() для смещения символа.

def upper(char):
from string import ascii_letters as _all
if char == ' ':
return ' '
return _all[_all.index(char)+1] if char != 'Z' else 'a'

def shift(message, key):
temp = []
for i in message:
char = i
for k in range(key):
char = upper(char)
temp.append(char)
return ''.join(temp)

message=raw_input('Enter your message here: ')
key = int(raw_input('Enter the desired key: '))
length=len(message)
print 'The length of your message is', length

print 'Your encrypted message is {0}'.format(shift(message, key))

Это работает как:

bash-3.2$ python caesar.py
Enter your message here: This works WITH or without CAPS
Enter the desired key: 10
The length of your message is 31
Your encrypted message is drsC GyBuC gSdR yB GsDryED MKZc
bash-3.2$

ответил(а) 2021-01-25T17:35:04+03:00 4 месяца, 3 недели назад
45

Библиография:
Kid Snippets: "Математический класс" (Imagined by Kids) - YouTube http://youtu.be/KdxEAt91D7k
Mary Had Little Lamb Nursery Rhyme With Lyrics - YouTube http://youtu.be/CkRdvGmcCBE
У Мэри был Маленький Агнец - Википедия, свободная энциклопедия http://goo.gl/FNEuyd

Исходный код Python:

Примечание: работа для отрицательных чисел сдвига также
Примечание: если обратное смещение, то мы кодируем - декодируем сообщение
Примечание: сохраняющиеся пространства также

small_chars = [chr(item) for item in range(ord('a'), ord('z')+1)]
upper_chars = [item.upper() for item in small_chars]

def encode_chr(chr_item, is_upper_case):
'''
Cipher each chr_item.
'''
# setting orig and end order.
if is_upper_case:
orig_ord = ord('A')
end_ord = ord('Z')
else:
orig_ord = ord('a')
end_ord = ord('z')

# calculating shift
temp_ord = ord(chr_item)+shift
# calculating offset order with modulo.
# char is after end_ord, calculating offset
num_of_chars = 26
offset_ord = (temp_ord - end_ord - 1)%num_of_chars
return chr(orig_ord + offset_ord)

# enable while loop to repeat until status not 'y'
status = 'y'
while status == 'y':
# enter word to cipher.
word = raw_input("Word: ")
# enter char shift
shift = input("Shift: ")
print

# create cipher list variable
cipher = list()
# loop trough each char in word
for chr_item in word:
# encode just letters.
# replace non-alfa with underscore: "_"
if chr_item in upper_chars or chr_item in small_chars:
# set is_uppser_case to True for upper case chars.
is_upper_case = (chr_item in upper_chars) and True
# cipher char.
temp_chr = encode_chr(chr_item, is_upper_case)
# append ciphered char to list
cipher.append(temp_chr)
elif chr_item is ' ':
cipher.append(chr_item)
else:
cipher.append('_')

# print word
print word
# print ciphered word
print ''.join(cipher)

# repeat again for another word?
status = raw_input("Repeat? [y|n]: ")
print

Тестовые случаи:

>>> 
Word: aAzZ!@
Shift: 1

aAzZ!@
bBaA__
Repeat? [y|n]: y

Word: aAzZ@!
Shift: -1

aAzZ@!
zZyY__
Repeat? [y|n]: y

Word: aAzZ@$
Shift: 27

aAzZ@$
bBaA__
Repeat? [y|n]: y

Word: aAzZ%^
Shift: -27

aAzZ%^
zZyY__
Repeat? [y|n]: n

>>>

Вывод:

Примечание: если обратное смещение, то мы кодируем - декодируем сообщение

>>>
Word: "Mary Had a Little Lamb"
Shift: 1

"Mary Had a Little Lamb"
_Nbsz Ibe b Mjuumf Mbnc_
Repeat? [y|n]: y

Word: _Nbsz Ibe b Mjuumf Mbnc_
Shift: -1

_Nbsz Ibe b Mjuumf Mbnc_
_Mary Had a Little Lamb_
Repeat? [y|n]: n

>>>

ответил(а) 2021-01-25T17:35:04+03:00 4 месяца, 3 недели назад
45

Вот простая программа шифрования Цезаря, написанная для Python 3, которая не должна быть очень сложной для перезаписи для Python 2:

import string

def main():
key = 5
table = str.maketrans(string.ascii_letters,
string.ascii_lowercase[key:] +
string.ascii_lowercase[:key] +
string.ascii_uppercase[key:] +
string.ascii_uppercase[:key])
plaintext = input('Please enter a phrase: ')
ciphertext = plaintext.translate(table)
print('Your encrypted phrase is:', ciphertext)

if __name__ == '__main__':
main()

ответил(а) 2021-01-25T17:35:04+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема