会停止吗?(警察)


94

这是警察的话题。强盗的线索在这里

您的挑战是要使一个程序永久运行而不暂停1,除非它获得一个或多个特定输入2。如果接收到该输入,则它必须在有限的时间3内终止。这是,因此,在获胜后的一周内,没有被强盗破解的最短答案。经过一周之后,请标记为安全答案,并显示暂停输入(中的> ! spoiler quote)。如果强盗破解了您的提交,请将其标记为“已破解”,并显示暂停输入(中的> ! spoiler quote)。

提交最好在TIO上可运行且可破解。允许在TIO上无法运行或破解的提交,但请提供下载/运行的说明。

请确定您的输入是确定的,并在所有运行中保持一致。有关详细信息,请参见此meta帖子

请不要“实施RSA”或对强盗有任何意义的东西。使用晦涩的语言和功能,不要无聊的加密和散列。我无法使用规则来强制执行此操作,但是如果您所做的只是,您可以期望获得好评sha(input) === "abcd1234"


1假设计算机不会关闭,破裂,被太阳吞没,宇宙热死机中的过热或TIO超时60秒。

2该程序必须在至少一个输入上停止。只要它在一个输入上永远循环并在另一个输入上停止,它就起作用。

3这必须少于60秒,以便可以在TIO上测试代码。


寻找完整的作品?

fetch("https://api.stackexchange.com/2.2/questions/135363/answers?order=desc&sort=activity&site=codegolf&filter=!.Fjs-H6J36vlFcdkRGfButLhYEngU&key=kAc8QIHB*IqJDUFcjEF1KA((&pagesize=100").then(x=>x.json()).then(data=>{var res = data.items.filter(i=>!i.body_markdown.toLowerCase().includes("cracked")).map(x=>{const matched = /^ ?##? ?(?:(?:(?:\[|<a href ?= ?".*?">)([^\]]+)(?:\]|<\/a>)(?:[\(\[][a-z0-9/:\.]+[\]\)])?)|([^, ]+)).*[^\d](\d+) ?\[?(?:(?:byte|block|codel)s?)(?:\](?:\(.+\))?)? ?(?:\(?(?!no[nt][ -]competing)\)?)?/gim.exec(x.body_markdown);if(!matched){return;}return {link: x.link, lang: matched[1] || matched[2], owner: x.owner}}).filter(Boolean).forEach(ans=>{var tr = document.createElement("tr");var add = (lang, link)=>{var td = document.createElement("td");var a = document.createElement("a");a.innerHTML = lang;a.href = link;td.appendChild(a);tr.appendChild(td);};add(ans.lang, ans.link);add(ans.owner.display_name, ans.owner.link);document.querySelector("tbody").appendChild(tr);});});
<html><body><h1>Uncracked Submissions</h1><table><thead><tr><th>Language</th><th>Author</th></tr></thead><tbody></tbody></table></body></html>


1
@LuisMendo假设无限内存是可以的
程序员

1
@ programmer5000感谢您的澄清。您应该将所有这些内容合并到挑战文本中。回答者不应阅读所有评论
Luis Mendo

6
我们可以将输入限制为整数吗?强盗可能会传入一些格式错误或输入错误的输入,以立即终止程序。我要么必须做很多仔细的输入验证,要么要使用可以捕获任意错误的语言。
xnor

3
@xnor我认为您应该进行输入检查。
斯蒂芬,

1
@StepHen如果解释器仍然能够解析格式错误的输入,则该方法有效。如果输入非法字符串,将R立即出错,甚至不会输入要破解的功能。我认为这并不算是实际终止功能。
JAD

Answers:


55

Malbolge,128个字节,由KBRON111破解

(=&r:#o=~l4jz7g5vttbrpp^nllZjhhVfddRb`O;:('JYX#VV~jS{Ql>jMKK9IGcFaD_X]\[ZYXWVsN6L4J\[kYEhVBeScba%_M]]~IYG3Eyx5432+rpp-n+l)j'h%B0

玩得开心!

(是的,我只是为此学习了Malbolge的。是的,花了很长的时间才终于开始工作。是的,这是完全值得的。)

包裹起来,因此您可以完整地看到它,“荣耀”:

(=&r:#o=~l4jz7g5vttbrpp^nllZjhhV
fddRb`O;:('JYX#VV~jS{Ql>jMKK9IGc
FaD_X]\[ZYXWVsN6L4J\[kYEhVBeScba
%_M]]~IYG3Eyx5432+rpp-n+l)j'h%B0

我用这个解释器来测试。我不确定这是否重要,但我想以防万一。


2
那就是TIO使用btw的解释器。
丹尼斯

2
哦,“玩得开心”是很好的补充
ЕвгенийНовиков

26
你是个混蛋。Malbolge是卑鄙的。
Draco18s

1
我被踩到了……我得到的最远的信息:在暂停之前的13个输入中,只有第一个和第三个有任何影响。彻底反向工程之后,我发现,先输入必须是6第三个是四大之一:!#/-。但是这种结合似乎并没有解决停顿的问题。我把它放在这里,也许有人更聪明地找到了解决方案。如果有人愿意,我明天将发布如何获得这些意见。编辑:现在我考虑了一下,我为进行反向工程而编写的程序可能存在错误,并且第一个输入可能不是6。第三角色仍然站立。
GrzegorzPuławski17年


23

JavaScript(ES6),17个字节,已破解

x=>{for(;x==x;);}

在TIO上,由于我不知道如何在TIO上执行Node.js readline,因此只需将输入保留在函数调用中即可。这对任何知道它的人都是显而易见的,而对任何不知道的人都是显而易见的。

在线尝试!

回答:

答案是NaN,因为在JavaScript中,NaN != NaN


2
破解。很好用的语言古怪!
程序员

3
您打赌:)我喜欢您的自信,这就是我为您编辑的内容:P
Stephen

12
NaN == NaN在JavaScript以外的许多语言中为false。我不会称其为“语言怪异”。
Nayuki '17

9
我相信NaN != NaN是一个浮点数的特征
undergroundmonorail

1
@undergroundmonorail:是的。两个IEEE浮点数之间的关系可以大于,等于,小于或无序。如果一个或两个操作数均为任何一种NaN,则比较结果是无序的。(IEEE 754二进制浮点具有许多NaN位模式:指数全为1且尾数为非零的任何内容都是NaN,而不论符号位如何。 NaN,并通过诸如+或的操作传播该信息max(),但大多数人不在乎:P)
彼得·科德斯

14

JS(ES6),67字节(破解

(x,y)=>{while(x!==y||Object.is(x, y)||!isFinite(x)||!isFinite(y));}

我没有搞砸,它可能有一个我从未发现过的简单解决方案。

感谢您的任何反馈,这是我的第一篇帖子之一

(+0, -0) 是的,js为负0



现在我意识到我不需要检查xy是否是有限的,但是由于它已经被破解了,所以我将不再编辑。可能是38个字节
Juan Tonina


9

Javascript(非node.js)

x=>{while(x+"h");}

所需的提交不使用throw。

提示所需的裂纹:

所需的提交不会覆盖.toString()或使用Set()其中任何一个。

所需的裂纹:

Object.create(null)


正确的破解链接(不是我的链接,不是指向唐·黑斯廷答案的链接)
斯蒂芬

Cracked#2不使用即可破解throw(尽管仍然会产生错误)
Grant Davis

再次破解而无需使用throw,我相信这一次是真的,因为Grant Davis并不为我工作。尽管如此TypeError秒。
Haumed Rahmani

2
您可以这样做,x=>{try{for(;x+"h";)}catch(e){for(;;)}}以便任何错误都将导致无限循环,因此缺少原型函数错误(或任何错误)将导致无限循环。
格兰特·戴维斯

1
仅适用于浏览器,但不确定为什么
会这样做

8

C(gcc),75个字节已破解

#include<stdio.h>
int main(){char c[9];while(1){scanf("%8s",c);printf(c);}}

在线尝试!

我以前从未在警察强盗中发布过文章。希望这不是明显。

解:

输入“%s”将导致此段错误。还有其他几种可以使用的。它们都是printf类似“%n”的说明符 。
这是经典printf漏洞。简而言之,格式字符串直接来自用户输入,因此任何printf说明符都会不安全地通过。



8

JavaScript(在浏览器中),已破解 79个字节

x=>{try{for(;x||x!=null||x!=void 0||x===null||x===void 0;);}catch(e){for(;;);}}

您应该在最新的浏览器中运行它(例如最新的Firefox ESR,最新的Firefox,最新的Chromium)。在旧版浏览器(例如Netscape 2,IE 4)上运行不计在内。

注意:由于超时而被浏览器暂停的情况在此处不算暂停。

测试此代码时请始终小心,不要崩溃浏览器,并乐于抢夺^ _ ^

document.all


我可以使用setTimeout吗?
ЕвгенийНовиков

@ЕвгенийНовиков您可以使用任何参数调用此函数。但似乎setTimeout用作参数无效。
tsh

想法是做var key=(()=>{setTimeout(args);return null})(),然后crackme(key)
ЕвгенийНовиков




6

外壳,5字节已破解

↑ε∞←ø

在线尝试!

有点解释,因为这种语言仍然很新:

←ø获取空列表的第一个元素:这将返回一个值,该值可以采用任何类型,无论是具体类型还是函数,然后将其应用于输入。创建一个由上一个结果的副本组成的无限列表(在大多数情况下,这意味着一个无限零的列表)。↑ε只要这些元素“很小”(即,其绝对值≤1),就从该列表中获取元素;在零的无限列表上,这将永远不会停止。


@Vedrac实际上是我想要的解决方案
Leo

好吧,那就破解了!
Veedrac '17


5

Ruby,31个字节(由Eric Duminil破解

0until(3.send(gets)==5rescue p)

在线尝试!

请注意,此操作必须在的结果中没有尾随换行符的环境中运行gets,否则就无法使其停止(我认为),因为以换行符结尾的任何内容都会出错,从而无法解决。



顺便说一句!没有方法3.methods返回5或退出循环。
埃里克·杜米尼尔

该死!我也独立地发现了该解决方案,但是我过于专注于使其等同5于认为正确答案将包含它所执行的功能……
Value Ink


5

Bash 4.2,14个字节(已破解

让我们再试一次。

let ${1,,}
yes

这在使用Bash 4.3的TIO上不起作用。输入是通过命令行参数进行的。

在Linux上并安装了gcc,可以按以下方式下载和构建Bash 4.2.53。

curl -sSL https://ftp.gnu.org/gnu/bash/bash-4.2.53.tar.gz | tar xz
cd bash-4.2.53
./configure
make -j

破解 基本上最终阅读了源代码。
Veedrac '17

4

视网膜,78字节(已破解)(已破解

^
1
+`^1(1+)
$1¶$&
s`(?<=^|¶)(1+)(?=¶)(?!.*¶\1+$)

¶(?!1+$)

^(1+)¶\1$

+`1
11

写作很有趣,希望破解很有趣

在线尝试!

在一分钟之内用意想不到的解决方案和预期的解决方案破解了。先发表,先发表评论。

预期解决方案:

11111或n-1的一元表示形式,其中n是任意整数




那么谁的裂缝很重要?(我先发布了该漏洞,但mbomb007首先发表了评论)
牛嘎嘎叫声

@Cowsquack均
程序员


4

Java 8,99字节,已破解

s->{try{Integer i=Integer.parseInt(s),c=i+32767;i+=32767;for(;i!=c;);}catch(Throwable t){for(;;);}}

这是这种类型的lambda Consumer<String>

取消高尔夫:

s -> {
    try {
        Integer i = Integer.parseInt(s), c = i + Short.MAX_VALUE;
        i += Short.MAX_VALUE;
        while (i != c) ;
    } catch (Throwable t) {
        while (true) ;
    }
}

在线尝试!(请注意,测试程序将在空输入时崩溃,但lambda本身不会!)(也请在TIO上使用“参数”而不是“输入”,因为测试程序使用参数,而不是STDIN)

预期答案:

-32767; 之所以可行,是因为Java keeps具有两个整数类型,intIntegerInteger是包装的对象int。此外,爪哇保持的高速缓存Integer的箱子小号-127通过127。该!=操作员检查身份,因此通过一些未装箱和自动拳击任何数目x,其中x + 32767是在[-127, 127]将最终是相同的Integer,从高速缓存对象,并且因此i != c将是假的。



4

Bash 4.2,10个字节(已破解

let $1
yes

这在使用Bash 4.3的TIO上不起作用。输入是通过命令行参数进行的。

在Linux上并安装了gcc,可以按以下方式下载和构建Bash 4.2.53。

curl -sSL https://ftp.gnu.org/gnu/bash/bash-4.2.53.tar.gz | tar xz
cd bash-4.2.53
./configure
make -j

1
破解 您带领我“绕圈转”,认为这与Shellshock有关,并将我链接到补丁版本:P。将意外的裂缝算作小报仇;)。
Veedrac

呵呵,不是我想要的。如果您想尝试一下,我发布了强化版本。
丹尼斯,

3

爪哇:1760(破裂

我觉得打高尔夫球这太刻薄了,所以我只是混淆了变量名,并将其命名为“ messy”。事实上,它是如此的卑鄙,以至于我会随着时间的流逝发布一些提示,以至于我可能会发现它被破解了。

提示1:从理论上讲,这是无限有效的输入,但是其中有一个是最“正确的”输入


public class Main {

	public static void main(String[] a) {
		try {
			while (a.length < 2) {
				int i = 0;
			}
			boolean invalid = 1 < 0;
			char l = '_';
			char h = '-';
			char[] DATATWO = a[0].toCharArray();
			char[] DATATOW = a[1].toCharArray();
			int length = DATATOW.length;
			if (DATATWO.length != length) {
				invalid = 1 > 0;
			}
			int transmissionStartIndex = 0;
			for (int i = 0; i < length; i++) {
				if (DATATWO[i] == l && DATATOW[i] == l) {
					transmissionStartIndex = i;
					break;
				}
			}
			int DATAONE = 0, reg = 0;
			boolean read = 1 < 0, full = 0 < 1;
			int bytes_read = 0;
			for (int i = transmissionStartIndex; i < length; i++) {
				if (DATATOW[i] == l && DATATOW[i + 1] == h) {
					bytes_read++;

					if (bytes_read == 8) {
						read = DATATWO[i] == h;
					} else if (bytes_read == 9) {
						invalid = (DATATWO[i] == h || invalid);
						System.out.println(invalid);
					} else if (bytes_read == 18) {
						System.out.println(invalid);
						invalid = (DATATWO[i] == h || invalid);
						if (invalid) {
							System.out.println("i36 " + DATATWO[i] + " " + h);
						}
						full = 1 > 0;
					} else if (bytes_read < 8) {
						DATAONE += (DATATWO[i] == h ? 1 : 0) << (7 - bytes_read);
					} else if (bytes_read < 18) {
						reg += (DATATWO[i] == h ? 1 : 0) << (8 - (bytes_read - 9));
					} else if (bytes_read > 18) {
						invalid = 1 > 0;
					}
					System.out.println(a[0]);
					System.out.println(new String(new char[i]).replace("\0", " ") + "|");
					System.out.println(a[1]);
				}
			}

			while (!(Integer.toHexString(DATAONE).equals("0x2b") && (read)
					&& Integer.toHexString(reg).equals("0xa6"))) {

				System.out.println(System.currentTimeMillis());
				try {
					Thread.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}

		} catch (Exception e) {
			while (true) {
			}
		}

	}
}

在线尝试!


似乎有两个空的论点起作用
Okx

另外,介意添加tio链接吗?我认为您只需将Main更改为Main
Okx

1
破解,除了一个bug。
user3033745

已破解 -没有特定于版本的错误。
Okx

3

Braingolf,18个字节已破解

1+[#£-0!e>:$_1>|]

在线尝试!

比上一本书难些,我将在此之后开始写一本真正的书。

答案是163


伙计,这可能是唯一尚存的提交atm。注意:i不起作用。
暴民埃里克(Erik the Outgolfer)

警告:这实际上是19个字节(£)。为什么不起作用-1?这很棘手。
暴民埃里克(Erik the Outgolfer)

@EriktheOutgolfer它是17个字符和18个字节。
完全人类

@totallyhuman我发誓我已经读过“ 19 UTF-8字节,18个字符”(已启用用户脚本)...
Erik the Outgolfer


3

JavaScript(ES7),41个字节(被黑客破解

编辑:修复了防止根本没有输入时崩溃的问题(感谢@totallyhuman注意)


可能存在几种解决方案,但是预期的解决方案相对简单。

(x=0)=>{for(;~x/x.length**3!=-2962963;);}

预期解决方案:

“ 8e7”(以字符串形式传递的科学计数形式的数字)原因
:〜“ 8e7” /“ 8e7” .length ** 3 = -80000001 / 3 ** 3 = -80000001/27 = -2962963


2
对此也没有任何投入,但是我不想这样打扰……除非这是预期的解决方案。:P
全人类的

@totallyhuman嗯,这不是预期的解决方案。:-)
Arnauld


2
更新:得到了预期的3个字节长的解决方案
ЕвгенийНовиков

3

Bash + Utils(由Dennis破解),74字节

我希望您喜欢tar,因为它是您可以使用的唯一实用程序。

cp /bin/tar .
env -i PATH=$PWD I=$? /bin/bash -r -c "$1"
while :;do :;done

在线尝试!

预期裂纹

tar -cf --checkpoint=1 --checkpoint-action=exec="/bin/kill $I" .



@丹尼斯尼斯!我发布了我想要的破解,这有点复杂。
西西弗斯(Sisyphus)

3

Mathematica,36个 26字节(已破解

#0[#;$IterationLimit=∞]&

这是一个非常短的循环#0[#;∞],它将不断地不断运行直到崩溃使您的内核崩溃……(这$IterationLimit只是为了确保您在大多数输入中永远被卡住)。

在Wolfram Sandbox上尝试!-如果陷入无限循环,则可以等待直到超时,或者可以按笔记本标题左侧的方形“中止评估”图标(unnamed)

注意:此功能更改您的$IterationLimit设置。




3

C#,118字节(破解

using System;_=>{while(1>0){try{if(Nullable.GetUnderlyingType(Type.GetType(Console.ReadLine()))!=null)break;}catch{}}}

我不希望这种情况持续太久,但是比看起来要尴尬的多。

基本上任何Nullable类的全名都可以使用,但是很难找到,如下所示:
System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
查找此字符串的一种更简单的方法是这样做typeof(int?).FullName



3

C,140字节(破解

n,i;f(){float x,y,z;for(scanf("%d %d",&n,&z,x=y=0);~((int)x-(int)(1/sqrt(y*2)));x*=(1.5-y*x*x))y=(x=z)/2,i=n-((*(int*)&x)/2),x=*(float*)&i;}

希望不会有太多无法达到预期输入的输入停止运行,但让我们看看。

在线尝试!



3

JavaScript(ES7),73个字节(已破解!)

q=>{r=(n,i=0)=>i>1e3?n:r(n*16807%(2**31-1),i+1);while(r(q)!=627804986){}}

不需要的解决方案:蛮力。期望的破解涉及数学。

请注意,由于取模,所以有许多解决方案(4194304)。



3

疯了 170字节

>>,>,>,>,>,[-----------<-<+<--<--->>>>]<++<<+<++[----->+<]>[----------------->+++++++<]>[----->>+<<]>>[-<->]<[--->++++++<]>[--->+<]+>-[-----------------<+>]<[-->-<]>+[+-]

在线尝试!


欢迎光临本站!通过从代码中删除换行符,可以节省11个字节。
Sriotchilism O'Zaic's

我忘了那是代码高尔夫,谢谢!
杰里


有效的解决方案!我估计其中有很多。对于任何解决/强行使用的人,预期的人是[az]。
杰里

对于每4个字符,最后一个字符正好有1个值使程序停止。因此,假设您可以nul进行脑瘫,那么就有256 ^ 4 = 4294967296个解决方案。顺便说一句,您可以删除两个先>保存2个字节。
user202729

3

JavaScript ES6(Node.js> = 6.0),326字节(安全)

((v,e=require('events').EventEmitter.prototype,l=_=>{while(1);},P=Proxy,p=process)=>(p.kill=p.exit,e.listeners=new P(e.listeners,{apply:(t,c,a)=>a[0]=='exit'?[]:t.apply(c,a)}),e.removeAllListeners=new P(e.removeAllListeners,{apply:(t,c,a)=>a[0]=='exit'?c:t.apply(c,a)}),p.on('exit',l),i=>{try{v(i)}catch(o){}l()}))(s=>eval(s))

我的其他挑战要简单得多,我不再试图混淆解决方案的方法,这为我节省了很多字节。这次,process.kill()将无法正常工作。

"delete process._events.exit;process.exit()"

在线尝试!


哇!不错的工作!
程序员

看起来您是赢家,尽管我期望代码更短
些-Piyin

3

Swift 3,14个字节(破解

while !false{}

要解决此问题,请将您的代码放在此语句之前或之后。

  • 您的解决方案必须:
    • 保持此语句完整,而无需修改其代码
    • 实际上让该语句运行
      • 只需将其注释掉,调用fatalError()等等,然后再不计算在内。
    • 修改此语句的行为以防止其永远循环
  • 该解决方案不涉及使程序崩溃。

我不了解Swift,但是我认为在此代码之前添加一个计时器,几秒钟后退出即可满足条件。

@Yimin heh,很聪明,但是它并没有修改此语句的语义,这就是我说“修改此语句的行为”时真正要寻找的东西
亚历山大

您确定解决方案有效吗?口译员对ambiguous semantics我大喊大叫。
丹尼尔(Daniel)

@Dopapp就是我以前尝试的方式。出于某种原因,使用具有相同类型签名的新infix运算符重新定义是合法的,但是尝试使用一元运算符执行相同操作会引发编译时歧义错误。这是有意的,我确定我有一个可行的解决方案
Alexander


2

cQuents,2个字节(破解1)(破解2

:A

请注意,这将很快达到TIO上的128 KiB输出限制,从而使其停止,但是在本地运行时,它将永久循环,除非中断输入。找到输入应该很容易。直到你这样做:A都将继续向您伸出它的三角形舌头。

还请注意,这应该只是,A但是我昨晚打破了隐式模式。在较旧的解释器版本上A可以正常工作。

裂缝:

输入为空/输入换行符是有效的破解。但是,除非通过将多个输入(以空格分隔)传递给程序,否则将终止它(如果给出2)或出错(如果给出3个或更多)。

在线尝试!


破解了吗 (输入为空时出错)
Luis Mendo


@crackers是的,这是有效的破解。不过,我将向发现非空输入破解的人表示敬意。
斯蒂芬

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.