14
\$\开始组\$

凯撒密码

凯撒密码移位=N是将字符串中的任何字母字符替换为以下字母的过程:N个字母表中前面的位置(在开头换行)。

这是凯撒的关键(shift=5)(假设是一个英文字母表):

这些:EFGHIJKLMNOPQRSTUVWXYZ映射到:FGHIJKLMNOPQRSTUVWXYZABCDE

这是将其应用于“你好,世界!”的结果:

“你好,世界!”“MJQQT,BTWQI!”

还有其他挑战(喜欢 这些)要求破解凯撒密码,使用密文以外的额外信息从数学上计算出移位。

这个挑战

这个挑战不会给你额外的提示。它只是要求:

«编写一个程序或函数,该程序或函数采用简短的Caesar加密文本,并极有可能找到原始的纯英语文本。»

为了避免任何疑问,我要求您尝试破解英语中的模式(例如,最丰富的字母很可能解码为“e”)。

您的功能/程序将作为输入:

  • 此ascii子集中的字符串:“abcdefghijklmnopqrstuvwxyz()-,;:“'!?“,包含5到10个字(即用”“分隔的位” ").

它应以高精度输出:

  • 转变N个(在范围内0..25)最有可能用于从由英语单词组成的未加密句子中获取此字符串的
  • 防移位M(M)(在范围内0..25)获取由英语单词组成的未加密句子需要(M=26-N除了N=0,其中M=0也是)
  • 未加密的句子本身
  • (只是它的字母字符)

评分

这两者都是,所以您需要编写一个短代码(低#字节)表现足够好(高#更正answ。)在大量测试用例上。

分数计算如下(这些是等价的):

$${\rm-score}=\frac{{\rm\#bytes}}{\rm-carcification}=\frac{10000\cdot{{\rm\#bytes}}}{\ rm\#correct\,\,answ.}=\ frac{{\rm\#bytes{}{1-\frac}\rm\#1errors}{10000}}$$

在上测试代码后10000个密文样本。最低分数(每种编程语言)获胜。

准确度必须为至少30%以获得合格答案。

10000个测试用例是在这里以下是摘录:

jubx rmnwcroh ngrbcrwp kruub cqjc fn 9 17还确定了我们总是让它计算所有0的所有后验可能性总是让它计算所有0的所有后验可能性福格利奥vrxufhv djuhh wkdw vxssob zloo eh yhub wljkw wkurxjkrxw 3 23位可靠消息人士一致认为,整个地区的供应将非常紧张zhuh qrw vhqvlwlyh wr wkh 3 23对wivv,jf zk'j rmrzcrscv kf repfev ivxriucvjj fw vtfefdzt jkrklj 17 9免费,因此无论经济状况如何,任何人都可以使用它svvecdbkdsyx yp ryg dbisxq dy cryor-rybx sx k 10 16如何在ivhlzivu kf gifultv,reu sp 17 9生产所需,以及svwev nwz,eqbp bpm illml 8 18已知,添加了

将第一列用作测试程序/函数的输入序列。

旨在正确预测输出。正确的输出以不同的有效格式在第二、第三和第四列中报告。与输出保持一致:始终以输出换档或防换档为目标(记住,这是26-N模26)或明文。

(注意:(1)电池文件是由固定长度的列组成的,它不是基于分隔符的;提供了CSV版本在这里它在必要时使用双引号,并用双引号转义双引号(""); (2) 电池文件基于语料库,可能包含冒犯性词语)

如果您的代码运行速度很慢,或者为了证明您在诸如AttemptThisOnline之类的服务上的得分,您可以只使用测试电池的一个子集,只要您从而不是樱桃采摘。如果可能的话,在宣布分数之前,请尝试在整个电池或您可以处理的最大头子集上本地运行代码。

\$\端组\$
9
  • 4
    \$\开始组\$ Vyxal,0字节,分数0/(402/10000)=0。您可能希望将+1添加到字节中,或者完全删除未更改的测试用例,因为cat程序通常很短 \$\端组\$ 评论 5月18日23:23
  • 2
    \$\开始组\$ 或者要求最低通过率为10% \$\端组\$ 评论 5月19日0:26
  • 2
    \$\开始组\$ 您是否碰巧有一种更容易解析的格式,比如CSV? \$\端组\$ 评论 5月19日4:26
  • 1
    \$\开始组\$ 以最大外观数进行旋转埃托伊斯尔在9657次测试中有效 \$\端组\$ 评论 5月19日4:45
  • 1
    \$\开始组\$ 取最常见的字母(不是空格)并假设它是e(电子)足以达到约35%。 \$\端组\$ 评论 5月19日6:06

5个答案5

重置为默认值
9
\$\开始组\$

木炭,31个字节,93.66%,得分33.1

Eβ∑Eθ∧№βλ№etaonisβλκηIηη

在线尝试!链接指向详细版本的代码。输出换档N个说明:查找最低值N个其中“明文”包含尽可能多的字母依托尼丝尽可能地。删除一个字母会将准确率降低到88.58%,而添加一个字母只会将准确度提高到94.65%,从而获得稍高的分数。甚至切换到计算M(M)将准确率降低到93.42%!

实际上,有一种方法可以从命令行运行整个测试套件,但遗憾的是,我自己从未尝试过,所以为了进行测试,我实际上编写了一个较长的版本,依次读取所有10000个字符串。

使用这种方法的一种变体,我的最佳准确度是99.17%,通过为字母添加负权重xxxjjkvp公司(是的,这是对xzj公司),加上不允许所有q个s后面没有u个.

\$\端组\$
4
  • \$\开始组\$ 改进后的99.17%方法有哪些错误? \$\端组\$ 评论 5月20日4:16
  • \$\开始组\$ @Simd通常是包含那些罕见辅音的短辅音,比如“我们可以找到这些人”,它认为这是编码的。 \$\端组\$
    – 尼尔
    评论 5月20日5:41
  • \$\开始组\$ 数量相同爱沙尼亚尽可能的n。 \$\端组\$ 评论 5月20日18:35
  • \$\开始组\$ @乔纳桑·艾伦(JonathanAllan)如果木炭有a)字典压缩和b)它包括爱沙尼亚。。。 \$\端组\$
    – 尼尔
    评论 5月20日18:41
6
\$\开始组\$

Vyxal公司,10个字节,99.9%,得分10.01

ka*伊泽洛伊DLб

在线试用!

基于乔纳森·艾伦压缩琴弦的想法,这是Vyxal字典中压缩得最好的旋转。与果冻不同,Vyxal具有字符串压缩功能瑟德内置于语言中。

---I#收集ka*#用小写字母转换输入---⑩#取最小值öDL#使用Vyxal字典压缩时的字符串长度

奇怪的是,这10个失败的测试用例是:

得到了“vg gb enmr vg,ohg”期望“它会夷平它,但”得到“是或否”的“qh c”“agu qt pq”“预期”已获得“rpe xh bti pcs id”预期“cap已满足并将”得到“sio oj ni vyu”期望“你能成为”获得了走私和盗版的“ct gaiuuzwbu obr dwfo qm”预期得到了“ihy iz nby gy ch nby”期望的“其中一个男人”获得“dnswpa,dnswfm,dnsxfnv,afek,vwfek,vgpens”预期为“schlep,schlub,schmuck,putz,klutz,kivetch”得到“w'a cb am shift wt”期望“如果”得到“h aoplm pz ohyzo,ildhyl”期望“小偷很严厉,小心”获得了“aol hesl vm aol玩偶”期望的“轮轴”

其中大多数是由于a)vyxal没有压缩两个字母的单词b)vyxal压缩了许多常见的三个字母序列。

\$\端组\$
1
  • 1
    \$\开始组\$ 可以确认\$93.66\%\$-实际分数可能取决于26个翻译的顺序,因为有很多翻译具有多重最大值,但您使用的顺序与Neil相同。运行端口以确认存在934/10000个错误。 \$\端组\$ 评论 5月20日20:52
5
\$\开始组\$

果冻, 19字节,\$94.65\%\$; 分数\$=压裂{10000乘以19}{9415}约20.18\$

《J》,“S$”

接受加密文本并产生猜测的一元链接。

在线试用!

怎么用?

方法与尼尔的回答,但以下情况除外:

  1. 翻译顺序不同
  2. 它使用反英雄(a)添加下两个最常见的字母,第页小时和(b)将e(电子)超过其他人。

下面是一些不熟悉的Python代码这为测试电池提供了100%的准确度(由于TIO的时间限制,只显示了前500个)

它通过找到最小长度的最佳压缩\$26\$使用Jelly字典进行变换(Linux操作系统Dennis电脑中的文件,分为短单词和长单词)。除了查找最短的压缩字符串外,它只做了一些调整,通过禁止11个字符串来避免9个错误结果:

“yt”“气”“cn”“xc”“否”“c”“千卡”“x”“paa”“ej”“wb”
\$\端组\$
4
  • \$\开始组\$ 疯狂的想法,但如果你把整个字典连接起来,以得到真正的字母分布呢? \$\端组\$ 评论 5月20日21:36
  • 1
    \$\开始组\$ @xnor有一些问题。。。实际的字典(以及制作压缩字符串)在Jelly本身中是不可用的(除非可能使用一些昂贵的嵌入式Python)。杰利的字典有很多非常非英语的条目(例如,压缩每个翻译并查看哪一个更短是非常糟糕的!我在Python中试过了)。 \$\端组\$ 评论 5月20日21:42
  • \$\开始组\$ @xnor^我在压缩测试中犯了一个错误,它只产生了9个错误。也许26个译本中的一个排列会导致一个都没有?! \$\端组\$ 评论 5月20日21:55
  • \$\开始组\$ 反英雄也可以方便地压缩到“Ẉ²»,它比我能找到的任何其他相关字符串都短。 \$\端组\$
    – 尼尔
    评论 5月23日0:11
\$\开始组\$

JavaScript(ES6),80字节/0.9468≈84.50

改进(*)从中汲取灵感尼尔的方法.

应为ASCII代码数组。

a=>(g=b=>i--?g(a.map(c=>n+=8920258>>(c-i)%26&c>>6,n=0)|n>b?(o=i,n):b):o)(0,i=26)

在线试用!(仅前100个条目)

(*)与我的相比初始版本基于2字符模式


JavaScript(Node.js),48字节/0.3269≈146.83

这是一个简短(快速)的例子,表明只考虑前两个字符就足以达到30%以上的成功率。

应为ASCII代码数组。

([x,y])=>(x+缓冲区(“BCFG?M;”)[(y-x+78)%26%7])%26

在线试用!(仅前100个条目)

65字节/0.4683≈138.80

使用更长的查找字符串可以获得更好的成功率和整体得分。但这有点违背了上述版本的目的,即尽可能减少有效代码。

([x,y])=>(x+缓冲区(“G8F:?M=4?6M?9;BF=G?4;BC49G”)[(y-x+78)%26])%26

在线试用!

\$\端组\$
0
2
\$\开始组\$

Python 3语言,131字节/0.9464=138.41927303465764

-感谢Nicola Sap

-得益于ShadowRanger,2个字节

lambda x:最大值((“.join(chr(97+(ord(u)-97+i)%26)*u.isalpha()用于x中的u)用于范围(26)中的i),键=lambda x:sum(映射(x.count,'etoanirs')))

这个答案比其他答案差得多,因为在Python中没有一种方便的方法来计算多个子字符串,所以我必须使用for循环来进行计算。

羔羊枚举偏移量,然后根据的出现情况判断字符串依托尼尔斯然后返回解密后的字符串。

告诉我你是否可以改进这一点。

在线试用!

\$\端组\$
8
  • \$\开始组\$ 注意,根据规则,您不需要输出非字母字符,您的算法也不需要它们。所以k个lambda可以是(…对于x中的i,如果i.isalpha())而不是(……如果i.isalpha(),否则i代表x中的i)(保存5个) \$\端组\$ 评论 5月20日14:04
  • \$\开始组\$ 如果按布尔值进行索引,则会额外保存2:(…[:i.isalpha()]表示x中的i) \$\端组\$ 评论 5月20日14:11
  • \$\开始组\$ 你真的需要定义k个作为羔羊?如果“”.join()直接放在你使用它的地方()lambda也不需要显式命名(允许使用匿名函数,Python lambda应答通常可以使用`f=`头) \$\端组\$ 评论 5月20日14:20
  • \$\开始组\$ 最后一个:总和(映射(x.count,'toanirs'))应该有效。总之,我认为这个算法编码在133。我还没有检查它的准确性,但它应该是完全等效的代码。 \$\端组\$ 评论 5月20日14:25
  • \$\开始组\$ @尼古拉·萨普:甚至更短,…[:i.isalpha()]可以只是i.isalpha()*。。。(或…*i.isalpha(),在这里无关紧要),何时是否字母收益False(错误),字符串乘以0真的,乘以1并保持不变;成本1*,而不是针对[:]. \$\端组\$ 评论 5月20日19:35

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.