[英]How do I get a function to iterate through a string and replace the first character of a string, second, etc?
我正在嘗試創建一個培根密碼加密程序,該程序讀取消息、假消息和整數密鑰的輸入,然后輸出通過凱撒密碼加密程序移位的假消息,但帶有培根密碼的空格和符號代表粗體和普通字體,或者我使用的“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() 中的問題,可能是 while 循環或 set 或范圍,我知道代碼真的一點也不優雅,但我是 n00b,我只是想弄清楚如何工作。 我真的非常感謝任何建議。
是的,問題出在帶有 while 循環的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 時,列表索引超出范圍。
因此,您可以通過在 listCaesar 索引后添加i += 1
來解決該問題。 即使我覺得這是正確的方法,因為您在索引之后而不是之前增加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
我知道這晚了 7 年,但這是一個很好用的 Baconian:它編碼和解碼:
What = int(input("Would you like to... 1. Encode, or 2. Decode? "))
if What == 1:
Input = str(input("")).upper()
BaconianTable = {
"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 ",
" ": " ",
".": ".",
",": ",",
"!": "!",
"?": "?"
}
X = list(Input)
Answer = ""
Y = 0
for i in range(len(Input)):
Answer = Answer + str(BaconianTable[X[Y]])
Y += 1
print(Answer)
elif What == 2:
Input = str(input("")).upper()
Input = Input.replace("AAAAA", "a")
Input = Input.replace("AAAAB", "b")
Input = Input.replace("AAABA", "c")
Input = Input.replace("AAABB", "d")
Input = Input.replace("AABAA", "e")
Input = Input.replace("AABAB", "f")
Input = Input.replace("AABBA", "g")
Input = Input.replace("AABBB", "H")
Input = Input.replace("ABAAA", "|i (or) j|")
Input = Input.replace("ABAAB", "k")
Input = Input.replace("ABABA", "l")
Input = Input.replace("ABABB", "m")
Input = Input.replace("ABBAA", "n")
Input = Input.replace("ABBAB", "o")
Input = Input.replace("ABBBA", "p")
Input = Input.replace("ABBBB", "q")
Input = Input.replace("BAAAA", "r")
Input = Input.replace("BAAAB", "s")
Input = Input.replace("BAABA", "t")
Input = Input.replace("BAABB", "|u (or) v|")
Input = Input.replace("BABAA", "w")
Input = Input.replace("BABAB", "x")
Input = Input.replace("BABBA", "y")
Input = Input.replace("BABBB", "z")
Input = Input.replace(" ", "+")
Input = Input.replace(" ", "")
Input = Input.replace("+", " ")
print(Input.capitalize())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.