Словарь Python «Цезарь»: найдите числовое значение +1, а затем верните связанный ключ - PullRequest
0 голосов
/ 13 ноября 2018

Это действительно интересная проблема с кесаревым шифром.

Вот мой словарь:

**{'v': 22, 'g': 7, 'w': 23, 'h': 8, 'a': 1, 'm': 13, 'c': 3, 'o': 15, 'd': 4, 's': 19, 'r': 18, 'u': 21, 'j': 10, 't': 20, 'f': 6, 'k': 11, 'y': 25, 'z': 26, 'l': 12, ' ': 0, 'b': 2, 'e': 5, 'q': 17, 'n': 14, 'i': 9, 'p': 16, 'x': 24}**

Очевидно, что словари не упорядочены. Они не организованы в алфавитном или числовом формате, только по парам.

Я должен:

  1. Найдите в этом словаре каждую букву в строке («привет, меня зовут цезарь»)

  2. Возврат закодированного сообщения. Если буква «а», это значение 1 в словаре. Тем не менее, мой код должен был бы напечатать букву 'b', которая является значением 2 в словаре.

Я видел примеры кесарей, использующих списки (которые я могу заказать), но не пытавшихся перемещаться по словарям таким образом ...

Я опубликую свой ответ, как только я это выясню. На данный момент я просто озадачен этим. Записывание этого помогло прояснить шаги, которые могут потребоваться.

NB Я думаю, что "" превращается в "a", если код работает правильно.

ожидаемый результат: "ijanzaobnajtadbftbt"

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018
message = "hi my name is caesar"
alphabet = ' abcdefghijklmnopqrstuvwxyz'
positions = {' ': 0,'a': 1,'b': 2,'c': 3,'d': 4,'e': 5,'f': 6,'g': 7,'h': 8,'i': 9,'j': 10,'k': 11,'l': 12,'m': 13,'n': 14,'o': 15,'p': 16,'q': 17,'r': 18,'s': 19,'t': 20,'u': 21,'v': 22,'w': 23,'x': 24,'y': 25,'z': 26}

# STEP ONE is to make an empty list to add your characters to. (Lists work well with dictionaries) 

encryptlist = []

# STEP TWO locate the value of the 'r' in caesar.

for chars in message:
Num = positions[chars]

Num возвращается: 18

#STEP THREE encrypt by one step (+1). You can keep the result within 0-26 using result % 27

encoded_Num = (Num + 1) % 27

#STEP 4 encrypt as a list

encryptlist.append(alphabet[encoded_Num])

encryptlist теперь возвращается ['i', 'j', 'a', 'n', 'z', 'a', 'o', 'b', 'n', 'f', 'a', 'j', ' t ',' a ',' d ',' b ',' f ',' t ',' b ',' s ']

# convert the list to a string

encoded_message = "".join(encryptlist)

encoded_message

возвращает: 'ijanzaobnfajtadbftbs', что является ожидаемым результатом

0 голосов
/ 13 ноября 2018

Вы можете создать обратный словарь и использовать его для построения вашей зашифрованной строки.Обратный словарь будет полезен для поиска символа, соответствующего «следующему» числу для данного символа:

d = {'v': 22, 'g': 7, 'w': 23, 'h': 8, 'a': 1, 'm': 13, 'c': 3, 'o': 15, 'd': 4, 's': 19, 'r': 18, 'u': 21, 'j': 10, 't': 20, 'f': 6, 'k': 11, 'y': 25, 'z': 26, 'l': 12, ' ': 0, 'b': 2, 'e': 5, 'q': 17, 'n': 14, 'i': 9, 'p': 16, 'x': 24}
reverse_d = {v: k for k, v in d.items()}

sentence = 'hi my name is caesar'
encrypted = ''.join([reverse_d.get(d[c] + 1, reverse_d[0]) for c in sentence])

print(encrypted)
# ijanzaobnfajtadbftbs

Обратите внимание, что я использую ключ по умолчанию 0, если число не найдено вreverse_d.

0 голосов
/ 13 ноября 2018

Если словарь всегда просто обозначает номер символа в алфавите, вам даже не нужен словарь, и это однострочный:

sentence = 'hi my name is caesar'
encoded = ''.join([chr(ord(c)+1) if ord(c)>96 and ord(c)<122 else "a" for c in sentence])

Это дает

In [14]: encoded
Out[14]: 'ijanzaobnfajtadbftbs'

Но для общего решения подход слайдера является наиболее элегантным, я бы сказал.

0 голосов
/ 13 ноября 2018

хорошо, вот мой дубль

d = {'v': 22, 'g': 7, 'w': 23, 'h': 8, 'a': 1, 'm': 13, 'c': 3, 'o': 15, 'd': 4, 's': 19, 'r': 18, 'u': 21, 'j': 10, 't': 20, 'f': 6, 'k': 11, 'y': 25, 'z': 26, 'l': 12, ' ': 0, 'b': 2, 'e': 5, 'q': 17, 'n': 14, 'i': 9, 'p': 16, 'x': 24}

sentence = 'hi my name is caesar'

for char in ''.join(sentence.split()):
    print(d[chr(ord(char) + 1)], end=' ')

выход

9 10 14 26 15 2 14 6 10 20 4 2 6 20 2 19 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...