2014-02-10 1 views
0

Я пытаюсь создать программу шифрования шифрования Baconian, которая читает ввод сообщения, поддельное сообщение и целочисленный ключ, а затем выводит поддельное сообщение, сдвинутое через программу шифрования шифров Цезаря, но с пробелами и символами Baconian cipher, представляющий жирный и обычный шрифт, или то, что я использую как «A» и «B».Как получить функцию для итерации по строке и заменить первый символ строки, второй и т. Д.?

Вот что у меня есть. Он в основном завершен, но я не могу заставить вывод циклически перемещаться по символам в строке, зашифрованной с помощью шифра Цезаря, вместо этого он просто использует первый символ. Я довольно уверен, что это что-то идиотское, но я не могу заставить его работать. Какие-либо предложения? :

def main(): 
    myBaconianMessage = input('Please input Bacon cipher message.') 
    myBaconianMessage = myBaconianMessage.split() 
    myCaesarMessage = input('Please input fake message to be encrypted.') 
    myCaesarKey = int(input('Please input integer key.')) 
    clues_A = {'A':'AAAAA'} 
    clues_B = {'B':'AAAAB'} 
    clues = {'a':'AAAAA', 'b':'AAAAB', 'c':'AAABA', 'd':'AAABB', 'e':'AABAA', 
      'f':'AABAB', 'g':'AABBA', 'h':'AABBB', 'i':'ABAAA', 'j':'ABAAA', 
      'k':'ABAAB', 'l':'ABABA', 'm':'ABABB', 'n':'ABBAA', 'o':'ABBAB', 
      'p':'ABBBA', 'q':'ABBBB', 'r':'BAAAA', 's':'BAAAB', 't':'BAABA', 
      'u':'BAABB', 'v':'BAABB', 'w':'BABAA', 'x':'BABAB', 'y':'BABBA', 
      'z':'BABBB', 'C':'AAABA', 'D':'AAABB', 'E':'AABAA', 'F':'AABAB', 
      'G':'AABBA', 'H':'AABBB', 'I':'ABAAA', 'J':'ABAAA', 'K':'ABAAB', 
      'L':'ABABA', 'M':'ABABB', 'N':'ABBAA', 'O':'ABBAB', 'P':'ABBBA', 
      'Q':'ABBBB', 'R':'BAAAA', 'S':'BAAAB', 'T':'BAABA', 'U':'BAABB', 
      'V':'BAABB', 'W':'BABAA', 'X':'BABAB', 'Y':'BABBA', 'Z':'BABBB'} 


    def decrypter(): 
     translated = myBaconianMessage[:] 
     for i, word in enumerate(translated): 
      for key in clues_A: 
       translated[i] = translated[i].replace(key, clues_A.get(key)) 
      for key in clues_B: 
       translated[i] = translated[i].replace(key, clues_B.get(key)) 
      for key in clues: 
       translated[i] = translated[i].replace(key, clues.get(key)) 
     encryptedMessage = ''.join(translated) 
     return encryptedMessage 


    def caesarPortion(): 
     myCaesarMode = 'encrypt' 
     alphabet = 'abcdefghijklmnopqrstuvwxyz' 
     caesarMessage = '' 
     newCaesarMessage = myCaesarMessage.lower() 
     for symbol in newCaesarMessage: 
      if symbol in alphabet: 
       num = alphabet.find(symbol) 
       if myCaesarMode == 'encrypt': 
        num = num + myCaesarKey 
       elif myCaesarMode == 'decrypt': 
        num = num - myCaesarKey 
       if num >= len(alphabet): 
        num = num - len(alphabet) 
       elif num < 0: 
        num = num + len(alphabet) 
       caesarMessage = caesarMessage + alphabet[num] 
     else: 
      caesarMessage = caesarMessage + symbol 
     thisCaesarMessage = ''.join(caesarMessage) 
     return thisCaesarMessage 


    def doubleEncrypted(): 
     caesar = caesarPortion() 
     listCaesar = list(caesar) 
     translate = decrypter() 
     listTranslate = translate.split() 
     for char in range(len(listCaesar) - 1): 
      i = 0 
      while i <= len(listCaesar): 
       i += 1 
       set = {'A':listCaesar[i], 'B':' '} 
       for symbol in listTranslate: 
        for x, word in enumerate(listTranslate): 
         for key in set: 
          listTranslate[x] = listTranslate[x].replace(key, ''.join(str(set.get(key)))) 
    return listTranslate 

    if len(myBaconianMessage) >= 1: 
     print(''.join(doubleEncrypted())) 

if __name__ == '__main__': 
    main() 

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

+0

Привет, ваш отпечаток отпечатка правильный, все функции внутри основного? или если да, то почему вы пишете именно так. –

+0

Да, похоже, это был единственный способ заставить main() продолжить выполнение caesarPortion() ... довольно уверен, что есть другой, правильный способ сделать это, но я не знаю, что это такое. – Elliot

ответ

0

Да проблема внутри doubleEncrypted функции с время цикла:

# this while loop will loop from `i` is incremented before indexing 
while i <= len(listCaesar): 

Ниже приведен пример фрагмент кода:

>>> listCaesar = 'MyName' 
>>> len(listCaesar) 
6 
>>> range(6 - 1) 
[0, 1, 2, 3, 4] 
>>> for char in range(6 - 1): 
...  i = 0 
...  while i <= 6: 
...   i += 1 
...   print i, listCaesar[i] 
... 
1 y 
2 N 
3 a 
4 m 
5 e 
6 
Traceback (most recent call last): 
    File "<stdin>", line 5, in <module> 
IndexError: string index out of range 
>>> 

В приведенном выше примере, i является приращением перед индексированием, поэтому, когда его до 6, индекс списка за пределами допустимого диапазона.

Итак, вы можете исправить это, добавив i += 1 после индексирования listCaesar. Даже я считаю, что это правильный путь, потому что вы индексируете i, а не раньше.

>>> for char in range(6 - 1): 
...  i = 0 
...  while i < 6:  # while i <=5: 
...   print i, listCaesar[i] 
...   i += 1 
... 
0 M 
1 y 
2 N 
3 a 
4 m 
+0

Я сделал это, но теперь я все время получаю ошибку: IndexError: индекс индекса вне диапазона. – Elliot

+0

, который вы сделали, можете ли вы напечатать i, listCaesar [i] перед циклом while? и я хочу увидеть последний i, сравнить с длиной listCaesar –

+0

Я просто взял i + = 1 и положил его после set = {... и т. д., потому что мне нужно, чтобы он работал в моем коде так, как я его хочу чтобы ... это неправильно? – Elliot

Смежные вопросы