Python Caesar密码解码器
在我的课程中,我的任务是创建一个凯撒密码解码器,该解码器接收一个输入字符串,并使用一个字母频率找到可能最好的字符串。如果不确定这有多大意义,请发布问题: 编写一个执行以下操作的程序。首先,它应该读取一行输入,这是经过编码的消息,由大写字母和空格组成。您的程序必须尝试使用移位S的所有26个可能值对消息进行解码;在这26条可能的原始消息中,打印出具有最高优点的消息。 为方便起见,我们将为您预先定义变量letterGoodness,长度为26的列表等于上述频率表中的值 到目前为止,我有以下代码:Python Caesar密码解码器,python,decoding,encryption,Python,Decoding,Encryption,在我的课程中,我的任务是创建一个凯撒密码解码器,该解码器接收一个输入字符串,并使用一个字母频率找到可能最好的字符串。如果不确定这有多大意义,请发布问题: 编写一个执行以下操作的程序。首先,它应该读取一行输入,这是经过编码的消息,由大写字母和空格组成。您的程序必须尝试使用移位S的所有26个可能值对消息进行解码;在这26条可能的原始消息中,打印出具有最高优点的消息。 为方便起见,我们将为您预先定义变量letterGoodness,长度为26的列表等于上述频率表中的值 到目前为止,我有以下代码: x
x = input()
NUM_LETTERS = 26 #Can't import modules I'm using a web based grader/compiler
def SpyCoder(S, N):
y = ""
for i in S:
x = ord(i)
x += N
if x > ord('Z'):
x -= NUM_LETTERS
elif x < ord('A'):
x += NUM_LETTERS
y += chr(x)
return y
def GoodnessFinder(S):
y = 0
for i in S:
if x != 32:
x = ord(i)
x -= ord('A')
y += letterGoodness[x]
return y
def GoodnessComparer(S):
goodnesstocompare = GoodnessFinder(S)
goodness = 0
v = ''
for i in range(0, 26):
v = SpyCoder(S, i)
goodness = GoodnessFinder(v)
if goodness > goodnesstocompare:
goodnesstocompare = goodness
return v
y = x.split()
z = ''
for i in range(0, len(y)):
if i == len(y) - 1:
z += GoodnessComparer(y[i])
print(z)
x=input()
NUM_LETTERS=26#无法导入模块我正在使用基于web的分级器/编译器
def SpyCoder(S,N):
y=“”
对于S中的i:
x=ord(i)
x+=N
如果x>ord('Z'):
x-=NUM_个字母
以利夫xgoodness比较:
善良=善良
返回v
y=x.split()
z=''
对于范围(0,len(y))中的i:
如果i==len(y)-1:
z+=GoodnessComparer(y[i])
打印(z)
编辑:作出了克里斯蒂安·齐普伊特建议的更改
请忽略缩进错误,它们可能是在我复制代码时出现的
该程序的工作原理如下:
- 获取输入并将其拆分为一个列表
- 对于每一个列表值,我都会将其提供给善良的发现者
- 它取字符串的优点,并将其他所有东西与之进行比较,当有更高的优点时,它会使更高的优点成为可比较的优点
- 然后,它将该文本字符串移动i amount,以查看善值是高还是低
打印正确的信息:在动物园加入我 但是下一个测试:UIJT JT B TBNQMF MJPG UFYU GPS EFDSZQUJOH
给出一个垃圾字符串:SGHR HR Z RZLOKD KHMD NE SDWS ENQ CDBQXOSHMF
当它应该是:这是一个用于解密的文本样本行 我知道我必须:
尝试每个移位值
了解单词的“优点”
返回具有最高优点的字符串
我希望我的解释是有道理的,因为我现在很困惑。这是我的实现,它工作得很好 您应该打印每个可能消息的优点,并查看程序为什么输出它
letterGoodness = dict(zip(string.ascii_uppercase,
[.0817,.0149,.0278,.0425,.1270,.0223,.0202,
.0609,.0697,.0015,.0077,.0402,.0241,.0675,
.0751,.0193,.0009,.0599,.0633,.0906,.0276,
.0098,.0236,.0015,.0197,.0007]))
trans_tables = [ str.maketrans(string.ascii_uppercase,
string.ascii_uppercase[i:]+string.ascii_uppercase[:i])
for i in range(26)]
def goodness(msg):
return sum(letterGoodness.get(char, 0) for char in msg)
def all_shifts(msg):
msg = msg.upper()
for trans_table in trans_tables:
txt = msg.translate(trans_table)
yield goodness(txt), txt
print(max(all_shifts(input())))
多亏了出色的克里斯蒂安·齐皮托,我的最终解决方案才奏效
x = input()
NUM_LETTERS = 26 #Can't import modules I'm using a web based grader/compiler
def SpyCoder(S, N):
y = ""
for i in S:
if(i.isupper()):
x = ord(i)
x += N
if x > ord('Z'):
x -= NUM_LETTERS
elif x < ord('A'):
x += NUM_LETTERS
y += chr(x)
else:
y += " "
return y
def GoodnessFinder(S):
y = 0
for i in S:
if i.isupper():
x = ord(i)
x -= ord('A')
y += letterGoodness[x]
else:
y += 1
return y
def GoodnessComparer(S):
goodnesstocompare = GoodnessFinder(S)
goodness = 0
v = ''
best_v = S
for i in range(0, 26):
v = SpyCoder(S, i)
goodness = GoodnessFinder(v)
if goodness > goodnesstocompare:
best_v = v
goodnesstocompare = goodness
return best_v
print(GoodnessComparer(x))
x=input()
NUM_LETTERS=26#无法导入模块我正在使用基于web的分级器/编译器
def SpyCoder(S,N):
y=“”
对于S中的i:
如果(i.isupper()):
x=ord(i)
x+=N
如果x>ord('Z'):
x-=NUM_个字母
以利夫xgoodness比较:
最佳值v=v
善良=善良
返回最佳值
打印(GoodnessComparer(x))
谢谢你的帮助 我正在编写同一个教程,并使用了稍微不同的方法。这避免了创建和调用函数:
inp = input() #to hold code text
code = list(inp) #store code as a list
soln = [] #store the 'Goodness' for each of 26 possible answers
y=0 #variable to hold total goodness during calculations
clear = [] #will hold decoded text
pos=0 #position marker for a list
#for every possible value of shift
#note range as 0 to 25 are valid shifts and shift 26 = shift 0
for shift in range(0,26):
for i in code: #loop through each letter in code
if i == " ": #spaces have no score so omit them
continue
else: #if it's a letter
x = ord(i)-shift #apply the test shift
if x < 65: #prevent shifting outside A-Z range
x = x + 26
x = x - 64 #turn ord into character position in A-Z with A=1
x = letterGoodness[x-1] #turn this into the Goodness score
y = y + x #add this to a running total
soln.insert(shift-1,y) #AFTER decoding all letters in code, add total(y) to list of scores
y = 0 #reset y before next test value
bestSoln=max(soln) #find highest possible score
for i in range(0,26): #check the list of solutions for this score
if soln[i]==bestSoln: #the position in this list is the shift we need
bestShift = i+1 #+1 as the first solution is 0
for i in code: #now decode the original text using our best solution
if i == " ": #spaces are not encoded so just add these to the string
clear.insert(pos," ") #pos used to track next position for final string
pos = pos + 1
continue
else:
x = ord(i)-bestShift #same operation as before
if x < 65:
x = x + 26
z = chr(x)
clear.insert(pos,z) #add the decoded letter to the clear text
pos = pos + 1
print("".join(clear)) #join the list of clear text into one string and print it
它们被左展开以“显示我的工作”,用于教程练习。如果在垃圾字符串“SGHR HR Z RZLOKD…”中的每个字符中添加1,则会得到“这是一个示例…”,因此它几乎是正确的。您应该尝试用有意义的常量替换一些神奇的数字,例如用
ord('a')替换65。
,26个字母NUM\u
。顺便说一句,在GoodnessComparer
中,您有范围(0,25)
,而不是(0,26)
;那是不是打字错误?还有一件事:在GoodnessFinder
中,你不需要每次都执行ord(i)
,只要i
是一个空格('
)。等价于eval(raw\u input())
,这没有意义,所以用一个普通的raw\u input()
调用替换它。@Cristian Ciupitu:那应该是Python 3代码。由于堆栈溢出允许您发布您自己问题的答案,这是一个家庭作业,你应该发布解码器的最终版本。你注意到了家庭作业标签,对吗?你的答案太好了。@CristianCiupitu:所以他不能只提交答案,而是先学习。
x = x - 64
x = letterGoodness[x-1]
y = y + x