解读源代码


142

注意:这项挑战现已不再适用于新提交的警察。这是为了确保没有人能够发布仅保持完整状态的提交,因为不再有更多的强盗对挑战感兴趣。

在这场警察和强盗游戏中,每个警察都会编写一个简单的程序来提供单个输出。然后,他们将公开有关其程序的四件事:

  1. 语言
  2. 程序长度
  3. 所需的输出
  4. 原始码的加粗版本

然后,强盗必须解扰源代码,以便他们的程序像原始程序一样起作用。


警察规则

您将编写一个简单的程序,强盗将尝试重新创建该程序。

您的原始程序必须具有简单的功能:执行后,它会输出单个字符串/数字并暂停。无论何时何地运行,它都应提供相同的输出,并且不应依赖于额外的库或Internet。

您的程序和输出必须使用可打印的ASCII(允许换行和空格)。输出不应超过100个字符,并且该程序应在不到5秒钟的时间内在合理的机器上运行。您也不允许在程序中使用哈希(或其他加密函数)

然后,您提供源代码的加扰版本和所需的输出。您可以随意保存源代码,只要保留字符即可。

您的分数是您提交的最短的程序,尚未破解。一周的时间后,完整的陈述将变得免疫。为了获得这种豁免,您应该编辑您的答案以显示正确的答案。(澄清:在您给出答案之前,您没有免疫力,仍然会被破解。)最低分获胜。

简单的示例警察答案

Perl,20岁

ellir"lnto Wo d";prH

Hello World

要么...

Perl,15岁

*3i)xp3rn3*x3t(

272727

强盗规则

强盗会将他们的破解尝试作为答案发布在位于此处的单独线程中。

您尝试破解每个提交。您的破解尝试将是源代码的完整版本。如果您的猜测与描述相符(相同的字符,输出以及所用的语言),并且您是第一个正确的猜测,那么您将赢得一分。重要的是要注意,您的程序不必与原始程序完全匹配,只需使用相同的字符并具有相同的功能即可。这意味着可能有多个正确答案。

得分最高(成功破解)的强盗获胜。

简单示例强盗答案

您的程序是print "Hello World";。(尽管print"Hello World" ;也可以。)

您的程序是 print(3**3x3)x3

安全提交

  1. ASP / ASP.Net,14(Jamie Barker)
  2. Befunge-98,15(萤火虫)
  3. GolfScript,16岁(Peter Taylor)
  4. 19岁的CJam(DLosc)
  5. GolfScript,20(用户23013)
  6. Perl,21岁(初级)
  7. Python,23(mbomb007)
  8. Ruby,27岁(历史学家)
  9. SAS,28(ConMan)
  10. Ruby,29岁(历史学家)
  11. Python,30(mbomb007)
  12. JavaScript,31(HSL)
  13. Ruby,33岁(历史学家)
  14. Marbelous,37岁(es1024)
  15. Ruby,43岁(历史学家)
  16. PHP,44(kenorb)
  17. Ruby,45岁(历史学家)
  18. Marbelous,45岁(es1024)
  19. Python 2,45(Emil)
  20. PHP,46(伊斯梅尔·米格尔(Ismael Miguel)
  21. Haskell,48岁(nooodl)
  22. Python,51(DLosc)
  23. Python,60(Sp3000)
  24. Python 2,62(泥泞的鱼)
  25. JavaScript 68(Jamie Barker)
  26. Mathematica,73岁(阿金德)
  27. 77岁的哈斯克尔(proudhaskeller)
  28. Python,90(DLosc)
  29. C ++ 104(用户23013)
  30. ECMAScript 6,116(Mateon1)
  31. C ++ 11、121(es1024)
  32. 草134(user23013)
  33. PowerShell,182(克里斯托弗)

未解决的提交

按发布时间排序。此列表由许多用户提供。

验证解决方案的小工具,由n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳提供


4
@xnor是的,就是这个意思。
PhiNotPi 2014年


7
您可能应该指定获胜者必须在一周后发布原始源代码。是什么阻止我发布胡言乱语并声称没有强盗得到正确答案?
user2023861 2014年

62
我以为“哦,我只是编写一个恶意程序,对其进行加扰,然后赢得这场比赛!”。但是后来,我试图编写一个恶意程序。
rodolphito

8
警告:警察,请勿使用Ideone测试您的提交,因为它存储您的程序,其他人可以看到它们。
rodolphito

Answers:


65

Python 3,大小74(破裂

在被《老大哥》重新教育后,Python变得不一样了。

输入:

print(war is peace)
print(freedom is slavery)
print(ignorance is strength)

第1和2行的末尾有两个换行符。

输出:

True
True
True

请注意,每个True都在自己的行中。


1
101号门后面是什么?
FryAmTheEggman 2014年

5
最初我有2+2==5第四个陈述,直到我发现=这太容易了。
xnor

5
1984年尼斯参考。
贾斯汀

2
破解。太好了
Sp3000

52

Python 3,大小12(破裂

print (abcd)

我的程序没有输出,也没有错误。


4
破解。很好,该解决方案非常违反直觉。
matsjoyce 2014年

2
非常好,我已经int有一段时间了。
福克斯威尔逊

@matsjoyce做得好。那是我想要的解决方案。
xnor 2014年

1
@matsjoyce是的,我希望有人最终会这样做。尽管如此,我还是鼓励大家不要宠坏自己,而是要设法解决问题。我向您保证这是一个可爱的解决方案。
xnor 2014年

我想我明白了。如果我先键入python然后在提示符下键入我的解决方案,那么我找到的解决方案将不起作用。但是,如果我将解决方案放在文件中并输入,它确实可以工作python file
kasperd 2014年


26

Python 2,大小50

开裂

我们已经知道问题的答案,但是问题是什么?

print *********************--///222222222222222222

请注意,没有尾随空格或换行符。唯一的空格字符是后面的单个空格print

输出量

42

我试图平衡代码的长度和难度,但是如果我错过了这两种方法,也不会感到惊讶。希望至少足以阻止暴力。



6
这本来是与大小42更好
一个CVN

23

Pyth -71 破裂

C-3P0: "Sir, the possibility,..."* 
Han Solo: "Never Tell Me The Odds!"

输出量

3720

*最初,乔治·卢卡斯(George Lucas)让Han打断了C3-PO。**

**自贾尔·贾尔(Jar-Jar)以来,他将此称为他的最伟大构想。


有趣的提示:尽管Pyth进行了所有更改,但这里仍然有一个有效的答案!


原版的

ts,*s,y30 l" : : i i Han Solo "eP-C"h"TsrhT

说明

其余字符在下一行。Pyth仅解释文件的第一行。

ts,组成一个2元组,并将它们的总和设为-1。
*乘法:
s,y30 l"..."将包含2 * 30的2元组和字符串(18)的长度相加。
eP-C"h"T得到h的ascii值减去10(47)的最大素数。
srhT获得0-10之间的数字总和。

总的来说,这基本上只是计算:(30 * 2 + 18)*(47)+ 55-1。阅读@isaacg的答案后,我注意到有一个非常简单的解决方案:*h30tC"y"31 * 120。

更新

*h30tC"y" "-P:Sir, e possibilit,...
Han Solo: Never Tell Me The Odds!"
即使在所有这些时间之后仍然可以使用...

抱歉,解释格式不正确,我不知道如何使用扰流块:S(@ Sp3000为您提供了更好的选择)

现在您可以在线运行Pyth!在这里尝试。谢谢@isaacg :)


9
以上内容可能包含有关“星际大战”创作的公然虚构信息。
FryAmTheEggman 2014年


@FryAmTheEggman您可以在块中使用标签,例如<br>
Sp3000

21

果酱,尺寸51 [安全]

main(int argc,char* argv){printf("Hello, World!");}

输出量

55
2292213229222231957511222223333751125537511222222135723331131931959319319

您可以在在线解释器中进行操作

这应该比看起来更容易破解。

暗示

从输出的第二行开始。少数数字并没有全部出现,而其他数字则经常可疑。为什么会这样呢?如果您可以解密,则其余部分几乎应该就位。

"that rrrrraging london Hail!v"{elccimf(;W))},(*,pa

当我想出那个字谜时,天气一定很糟糕

。提示应该指向这样一个事实,即第二行由压缩的素因数分解构成。我希望从那里可以确定要在字符串中输入多少个字符和哪些字符,最后只保留几个字符。


9
等等,这是乱七八糟的吗???
TheDoctor 2014年

18

Befunge-98,尺寸15 [安全]

"quick"
*+.@\_j

输出量

3314

原版的

“ u_ji@q.+k*c
”
Befunge的一个奇怪但众所周知的功能是,您可以使用相同的引号终止字符串,这实际上将整行(引号除外)压入了堆栈。作为一个额外的技巧,我通过反转指令指针来再次重用同一字符串u。然后,这只是一些算术运算:核心思想是对所有这些值求和(通过k重复+操作来完成)。


您在哪个解释器上进行了测试,特别是他们对单元位宽做出了哪些假设?
彼得·泰勒

@PeterTaylor我已经在x86_64 linux下的cfunge上对其进行了测试。一些测试似乎表明它使用带符号的64位整数,尽管我可以说我的解决方案不依赖于溢出语义,所以我不确定是否重要。
FireFly 2014年

好的,所以我不应该在寻找8位溢出。可惜,这可能简化了它;)
彼得·泰勒

啊。我制作了要打印的程序33123300附近还有其他几个程序3314。如此近...
贾斯汀

@Quincunx很棒...:P
FireFly

16

GolfScript(16字节)[安全]

%%()*../1129n{}~

预期产量:

-117345085515973157874551915956356303213327583847247840186528288852476459638212404362749

原始资料:

n)~{.*911%(}./2%


这个预期的输出是不包括尾随的换行符,还是仅不输出换行符?
ProgramFOX 2014年

@ProgramFOX,输出将以换行符结尾。我知道避免这种情况的唯一方法是需要:
彼得·泰勒


13

Python,69个字符[ 由grc破解 ]

乱码:

((((((((((((())))))))))))),,,,accdddiiiiillmmnopprrrrrssssssttttttttu

输出:

1083

这只是一点点无害的乐趣:)在CPython 2.7.8、3.3.2上进行了测试,并且非常有用PyPy3 2.3.1。


说明

使用内置的功能strdictlist建立一个字符串,然后应用mapord该字符串转换为整数,然后将其列表sumMED值。




11

Python 3,70个字符

乱码:

""(((())))****++++222222222;;;;;=======cccccccccceeeiinnpprrttxxxxxxxx

输出(99个字符长):

388626024960000000000026872002432000000000000676169243200000000000007317718780000000000000028820330

更新资料

已经过去了一周,所以这里有个提示,而不是发布答案:

尝试取数字的平方根并从那里开始



9

JavaScript,94 被FireFly破解

alert(' '' '''((()))+++,,,,,,,,,,,,,000111111114444577888;;;;;======[[[]]]aaafhinorrrrvvvxx||)

输出量

fun in the sun

原版的

a=alert;v='';r=[1,7,8,14,11,8,14,10,0,5,14,4,7,8];for(x in r)v+=('h'+(1==0)+a)[r[x]]||'';a(v);


我有一种感觉,这不适用于所有浏览器/引擎。您在什么环境下进行了测试?
Martin Ender 2014年


哦...我确信您是alert第一位的,因为索引与所需字符非常匹配。有趣的巧合。
FireFly 2014年

当我开始使用它时,我实际上也首先拥有它,但是我进行了更改以减少浏览器差异。
SLuck49 2014年

在Chrome上不起作用。我有最新版本。它说Syntax Error: Unexpected String
Oliver Ni




7

Ruby,33- 被user23013破解

enpsttux [[[]]]++\-\**????$$$$...

输出:

[*]

原版的:

puts ?[+[*?*..?]][$$-$$]+?\\.next


这是哪个版本?
林恩

@nooodl我有1.9.3,但是这个没有什么版本特定的。
门把手

这很难。到目前为止,这是我所拥有的:puts 显然是这里的第一件事.next,可以使用另一个关键字,其余的是带有红宝石$变量和字符数组创建的
魔术


@ user23013太好了!但是不是原始的。我可能应该输出实际上不在源代码中的输出字符;)
Doorknob

7

Python2,132个字符

____        ,,,,:::''""""""""""((()))[[]]\\\0126aaaabcccceeeeeeeeeEffggiiiiiilllllmmmmnnnnnnooooopppppqqrrrrrrrrrssssStttttttuuvxxyy

输出(用换行符):

chance

更新版本,96个字符

原始版本的答案建议使用exec而不是compile+ eval,因此这里是简化版本:

____       :::''""(())[[]]\\\0126aaabcccceeeeeeeeEffiimmnnnnooopppqqrrrrrrrrrssStttttttuuxxxxyy

更新:破解

Alex Van LiewKennyTM完全破解了。原始解决方案是(向右滚动以显示扰流板):

                                                                                                                                eval(compile('try: compile("from __future__ import braces","","single")\nexcept SyntaxError as q:\n\tprint q[0][6:12]',"","single"))
                                                                                                                                exec('try:exec("from __future__ import braces")\nexcept SyntaxError as q:\n\tprint q[0][6:12]')
                                                                                                                                The hint meant "Consider {}, which are not present in the source code".

有多少个换行符?
Sp3000

无(不计算逻辑换行符,如\n内部字符串文字)。使用换行符,代码可能会更短。
六。

2
+1不能给我足够的xs和cs来做我想做的事情:P
Sp3000

1
我可以考虑一下吗?让我们从一个模糊的开始:Don't count ones which exist. Count ones which do not exist
六。


7

Ruby,29岁[安全]

试图看看我能在多长时间内获得Ruby而不会被破解。

paper view
otool
$()**,.8<<=>

输出量

[0][0, 3][0, 3, 6][0, 3, 6, 9][0, 3, 6, 9, 12][0, 3, 6, 9, 12, 16][0, 3, 6, 9, 12, 16, 20]

原版的

eval <<p*8 o=*o,$>.write(o) p

说明

第一行创建一个Heredoc,此文档从下一行开始,并由尾部定界p,然后将所得字符串自身连接8次。由于它以换行符结尾,因此可以有效地创建循环。循环代码将一个数组分配给变量o,该数组由中的元素组成o.to_a(通过*简写形式),然后是的输出$<.write(o),该输出转换o为字符串,将其打印到STDOUT,然后返回打印的字节数。第一次分配一个变量是nil为了评估右侧,因此在第一次运行时*o如果为空,则写操作不输出任何内容并返回0。每个后续回合输出前一回合输出的字节数组。使用以p分隔的heredoc创建输出的诱饵方法,p并且$><<,在加扰的字符中,该方法无效,因为您需要字节计数。





6

Haskell,100个字符(无效,输出时间过长)

//Sup
tl=[]
while(syn==(+j)) tl+=b.a();
//(: #jquery :)\\
$("#jquery").on("click", j=>alert(j==m))

输出:

"\er\\e\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\


原版的

(#)=(>);(//)=(++)
l=j.show
main=putStr.l.l$l"eer"
j[]="\\"
j(y:u)=let(q,c)=break(#y)u in y:j c//j q

5
我想了一下,我正在阅读“你好世界的进化”问题。
六。

1
@Vi是的,但我认为Levenshtein距离在本文中比7略多。
Zaq 2014年

1
输出超过100个字符
Lynn

1
@Zaq:大小限制不是代码大小,而是输出!
林恩2014年

1
嗯 我猜你在做些什么fix show。绝对
难以破解

6

J,22个字节

!%()1348:::bbceehorvxx

输出(97个字符)

1226317306651180983274420265228191056569220222873505571155987454033425908908110103433163350999040

我希望这几乎是不可能的...


6

CJam,32个字节(已破解

混乱的来源

"Beware the Jabberwock, my son!"

输出量

4074552392882954617076720538102062920

2
嗯,您是从哪里获得将报价用作加扰的CJam代码的想法的。;)
Martin Ender 2014年


@MartinBüttner:这是一首诗,而不是电影名言。完全不同!
丹尼斯

@丹尼斯·怀特,我的电影也不是。(不完全是从,虽然:d。)
马丁安德


5

TinyMUSH 3.1,20

乱码:

(#ret,#3!#+#2i\2#,@)

输出:

3210

6
我们应该如何运行呢?语言参考在哪里?(该链接在这里无济于事)。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 2014年

3
@n connectingh̷͉̃a appropriateh̸̡̅ẗ̵̨́d̷̰̀h您可以通过连接到运行相应TinyMUSH版本的MUSH来运行此代码。浏览此处查找“服务器类型”为“ MUSH”的服务器,或从此处下载服务器源并自行运行MUSH。
Muqo 2014年

5

Python 3,长度110 [ 由grc破解 ]

乱码(\n表示换行符)

\n\n\n   ""((((())))),.......9::;===IOS[]__addeeegghiiiiiiiiijllmmnnoooooooppprrrrsssssssssstttttttttttuuuuuvwyyy

输出:

The better is Flat dense. break never of be do at never. If bad it honking

这是另一个有趣的地方-并不意味着要努力,而是一些不寻常且令人困惑的事情。:)


说明

看起来随机的单词取自PythonZen(PEP 20),它会通过复活节彩蛋自动打印出来import this。正如9::[]现在所暗示的那样,这段话只是第九个单词。
要提取第九个单词而不在导入时自动打印段落,我们将其重定向sys.stdoutStringIO()



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.