Проблема с Цезаря Шифра и циклами - PullRequest
0 голосов
/ 03 мая 2019

Я делаю этот декодер Caesar Cipher и хочу, чтобы программа печатала каждую опцию (26 способов ее сдвига).Тем не менее, когда я запускаю свой код ничего не показывает, в чем была моя ошибка.Если вы знаете, пожалуйста, скажите мне, я новичок в кодировании и нуждаюсь в помощи.

import sys
import time

L2I = dict(zip("ABCDEFGHIJKLMNOPQRSTUVWXYZ",range(26)))
I2L = dict(zip(range(26),"ABCDEFGHIJKLMNOPQRSTUVWXYZ"))

msg = ("What is the intercepted message \n")
for character in msg:
  sys.stdout.write(character)
  sys.stdout.flush()
  time.sleep(0.1)
msg_ans = input("> ")
msg_ans = msg_ans.strip()

shift = 0
def decipher(msg_ans,shift): 
  while shift < 26: 
    for i in msg_ans.upper():
      if i.isalpha() == True : 
        msg_ans += I2L[ (L2I[i]+ shift)%26 ]
        shift += 1
      else: 
        msg_ans += i
        shift += 1 
  print (msg_ans)
decipher(msg_ans,shift)

Я ожидаю, что он выдаст 26 способов его перемещения.Однако, когда я помещаю слово «Hello», я получаю «HelloHFNOSMKSTXRQZBGWUCDHBAJLQLKTVAVVFIO» вместо «IFMMP JGNNQ ...»

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Есть пара вопросов.Во-первых, вы увеличиваете shift каждый раз, когда проверяете один символ.На самом деле, вы хотите увеличивать его только после каждого полного цикла сообщения.Вы также должны переместить инициализацию в функцию.Нет смысла передавать shift, поскольку вы просто пробуете все 26 возможностей по порядку.

def decipher(msg_ans): 
    shift = 0
    while shift < 26: 
        for i in msg_ans.upper():
            if i.isalpha() == True : 
                msg_ans += I2L[ (L2I[i]+ shift)%26 ]
            else: 
                msg_ans += i
        shift += 1
    print (msg_ans)

На данный момент, однако, нет причин использовать цикл while вместоfor:

def decipher(msg_ans): 
    for shift in range(26): 
        for i in msg_ans.upper():
            if i.isalpha() == True : 
                msg_ans += I2L[ (L2I[i]+ shift)%26 ]
            else: 
                msg_ans += i
    print (msg_ans)

Другая проблема заключается в том, что вы просто добавляете новые символы в конец вашей входной строки.Вы не указываете, в какой форме вы на самом деле хотите, поэтому предположим, что вы хотите это в списке строк.Вам нужно будет инициализировать список, построить временную строку на каждой итерации, а затем добавить временную строку в список:

def decipher(msg_ans): 
    possible_messages = []
    for shift in range(26): 
        decoded_msg = ''
        for i in msg_ans.upper():
            if i.isalpha() == True : 
                decoded_msg += I2L[ (L2I[i]+ shift)%26 ]
            else: 
                decoded_msg += i
        possible_messages.append(decoded_msg)
    return possible_messages

Затем просто напечатать результат вашего вызова функции:

 print(decipher(msg_ans))
0 голосов
/ 03 мая 2019

msg должно быть так

msg = "What is the intercepted message \n"

Также вы, вероятно, захотите напечатать вместо возврата здесь

return msg_ans
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...