我最近使用python“完成”了一个编码器/解码器(这是一个粗略的草稿。不久将创建一个更加用户友好的shell!),我在使用实际的“解码器”位时遇到了麻烦。
我尝试进行猜测和检查,但目前复杂的公式已超出我的范围。
使用"6 5 14 18 6"
作为输入字符串的结果是"azmua"
,而不是"alpha"
。
alphabet = 'abcdefghijklmnopqrstuvwxyz'
betaset = [26,0,1,25,24,2,3,23,22,4,5,21,20,6,7,19,18,8,9,17,16,10,11,15,14,12,13]
gammaset = [13,26,12,0,14,1,15,25,11,24,10,2,16,3,17,23,9,22,8,4,18,5,19,21,7,20,6]
numberbet = '01234567891011121314151617181920212223242526'
message1 = input("word? \n\
")
message1_out = ' '
message2_out = ' '
newposition = 26
##Variables above^
##Encoder below
for letter in message1:
if letter in alphabet:
position1 = alphabet.find(letter)
position2 = (position1 + betaset.index(position1)) % 26
position3 = (position2 + gammaset.index(position2)) % 26
message1_out += str(position3) + ' '
print('|' + message1_out + '| ')
##Decoder code below
message2 = input("word2? ")
for number in message2.split(" "):
position4 = numberbet.find(number)
##The line directly below this comment is the troublesome one.
##The addition to position4 needs to be a more complex function, but I can't figure it out :/
position5 = (position4 + 20) % 26
message2_out += (alphabet[position5])
print(message2_out)
有人要求此解码器的全部目的是将 back 组数字转换成单词。这里是解码器部分。当我放入"6 5 14 18 6"
时,我的结果应该为"alpha"
。相反,结果为"azmua"
。我可以看到这是由于行"position5 = (position4 + 20) % 26"
引起的,但我不知道如何获取应替换"+20"
的公式。
该过程应进行some input's placement in numberbet
("6 5 14 18 6"
)+ reverting back to original character
(a为6,l为5,依此类推),并串成一个单词,然后打印。问题是还原步骤。
现在显示的是其中的实际编码器系统。 (侧边栏:我现在明白为什么如此混乱)。我的系统要做的是通过编码器运行第一个输入。字母的位置被获取,然后经过betaset,然后经过gammaset。在单独的时间,可以输入数字以获得字母输出。 这就是使用betaset和gammaset的地方。
我需要的是能够将已编码的消息解码为一个单独的步骤。
我测试了答案中给出的一些代码(感谢@Ghassen!),并据此得出了答案:
for number in message2.split(" "):
if number in numberbet:
position4 = gammaset.index(int(number))
position5 = betaset.index(position4)
message2_out += (alphabet[position5])
print(message2_out)
该代码的唯一问题是字母p。它输出alpha
而不是alpha
。我不太确定为什么,也许是因为@ Tomothy32引发的问题,有关数字字符串中早期出现的“ 12”之类的数字。我现在的困境是,我不知道如何更改数字字符串,而仍然保留字符串,并且不改变解码器的功能 太多,仍然可以访问它。
证明我发布的代码确实有效 ,但我犯了一个错误。哎呀