会停止吗?(强盗)


46

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

您面临的挑战是通过查找使其停止的输入来破解警察的提交。您不必找出原因,也可以找出所有导致输入停止的输入,如果有多个输入,或者警察打算输入的输入,则仅需输入一个即可。

一旦您破解了提交内容,请在评论中发布指向它的链接,或编辑到警察的帖子。您还可以在MOD的帖子中标记您对Mod的提交进行编辑。另外,在此主题的答案中发布使用的输入和指向警察职位的链接。破解最多提交内容的强盗获胜。

只要他们不同,多个人就可以将裂缝发布到同一个警察提交的文件中。

(如果SE将您重复的答案转换为评论,则您可能需要对此功能进行投票)


寻找完整的作品?

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.innerText = 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>


2
是不同的意思是不同的输入(例如,所有以2结尾的输入都破解了警察的职位-您可以由不同的人发布以2结尾的不同数字吗?)或输入种类不同或输入类型不同吗?
斯蒂芬

1
多个人可以将裂缝发布到同一份警察提交的报告中……请定义不同的
丹尼斯,

Answers:


49

门把手Malbolge

在线尝试(感谢丹尼斯!)

Windows输入: F_⌠1234567890

使用ISO-8559-1在基于Linux的系统上输入: F_ô1234567890

Malbolge程序工作原理的核心在于它取决于Malbolge解释器的行为,如果遇到任何不在33和126之间的指令,该行为会导致无限循环。该程序的构造使得您的输入将允许您修改一条指令。

我修改了解释器,使其在执行开始时转储程序内存状态,并生成“标准化”源代码,该源代码采用将在程序执行期间运行的操作码列表的形式。利用该信息,您可以(缓慢地)确定,即使程序接受了13个输入,但实际上只有第1个和第3个输入才有意义。

通过浏览规范化的代码和内存转储(以及一点调试器帮助),我设计了以下内容:

a = op(输入1,29524)

b = op(输入3,a)

c = op(486,b)

d = op(c,37)

e = d / 4 + d%3 * 3 ^ 9

e必须介于33和126之间

op规范中描述的所谓的tritwise“ op” 在哪里。使用此信息,您可以编写一个简单的程序,对可能的输入(0到255)进行迭代,找到满足上述条件的所有解决方案。我发现2219种可能的解决方案,其中一些可能无法解决(您无法输入所需的字符)。具体来说,以上输入基于解决方案:

(Input 1 = 70, Input 3 = 244)


我没有代表在警察岗位上发表评论。有人可以帮我吗?
KBRON111

4
欢迎来到PPCG!做得好!我认为,有了这个裂缝,您很快就会有足够的代表了:)
Stephen

1
我评论了。是的,出色的工作;我一半期望Malbolge能够持续一周!
Veedrac '17

6
干得好!TIO使用UTF-8,但是通过将其包装在Bash中,仍然可以验证您的破解。tio.run/…顺便说一句,您似乎不需要任何东西F_ô
丹尼斯

1
现在,我可以再次入睡
Juan Tonina


13

JS(ES6),胡安·托尼纳

+0,-0

花了点时间寻找Object.is。基本上,+0 === -0因为将===它们视为数字,并且0是有限的,但是Object.is+0-0视为不同的对象。非常聪明的警察:)

在线尝试!


当我登录时,Ninja收到了。拍摄。
user3033745

该死的,比我思考代码的时间还快解决了:D
Juan Tonina

11

Python,Siphor

class A:
    i = True
    def __eq__(self, a):
        self.i = not self.i
        return self.i

a = A()
f(a)

我们只是重新定义相等性,使其行为完全符合终止程序的要求。


尽管我想我本可以定义__eq__raise...
g.rocket

我刚要返回0:p
乔纳森·艾伦

@JonathanAllan怎么工作?
g.rocket

1
可以肯定,class A:__eq__=lambda s,o:0并能f(A())完成工作。
乔纳森·艾伦

1
是的,需要否定> _ <
乔纳森·艾伦



7

JavaScript(Node.js),Adnan

[]并且[]似乎起作用。我尝试了一群人,包括nullundefinedNaN...

[] >= [] && [] <= [] && [] != [] 评估为true。

故事的寓意:JavaScript很奇怪

在线尝试!


是的,数组只是对象。
程序员

对于这些类型的比较,对象将转换为字符串。
科纳·奥布莱恩

7

JavaScript(ES7), Arnauld

标准

"8e7" 是解决方案

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

var key = "8e7"

crack_me(key)
console.log("stopped :)")

哈克

无需计算此数字,我们可以重新定义 length属性

这设置~x/x.length**3!=-2962963false

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

var key = {toString:()=>"2962962",length:"1"}

crack_me(key)
console.log("stopped :)")

运营商优先

~ 按位不是第一

** exponentiation 第二

/ division 第三


6

巴什·韦德拉克

LD_TRACE_LOADED_OBJECTS

在线尝试!

ld.so(8)联机帮助页:

LD_TRACE_LOADED_OBJECTS

如果设置为任何值,则使程序列出其动态依赖项,就像通过运行一样ldd(1),而不是正常运行。


我以为这会持续更长的时间!优秀作品。
Veedrac '17

1
@Veedrac:我想既然您指定了bash,就不太可能找到静态链接的对象(例如busybox?)/bin/yes,但这是可能的,在这种情况下,此env var将被忽略。
彼得·科德斯

6

Mathematica,郑焕敏

Unevaluated@Throw@"hammertime"

不知道这是否是预期的解决方案,但是它传入的表达式直到#在函数内部被引用之前才被求值,这将导致它立即从函数返回而无需进行任何进一步的求值。您可以看到该函数实际上已被调用(而不是在调用该函数之前就抛出异常),方法是将该函数更改为:

#0[Print@"stop";#;$IterationLimit=∞]&

确实会stop在抛出错误之前打印出。


答对了!(我实际上是想去的Unevaluated[Abort[]],但也是一样。)
JungHwan Min


5

红宝石

exit

没有换行符。3.send('exit')当然不等于5,但是它执行Kernel#exit

通过引发SystemExit异常来启动Ruby脚本的终止

可以致电exit3 原因是

内核模块包含在Object类中,因此它的方法在每个Ruby对象中都可用(作为私有方法)。

abort 也可以:

立即调用Kernel.exit(false)有效地终止执行。如果给出了msg,则在终止之前将其写入STDERR。


5

JavaScript(Node.js)程序员5000

已经破解了,但是我的略有不同:)没有足够的代表可以在警察中对此进行评论。也可以随意编辑以修复格式,这是我的第一篇文章。

我主要将其设置为__proto__等于引发的函数。摘自Mozilla页面的原型。(对不起,代表不好,无法发布链接。)

x = {}
let No = function () { throw 'halted' }
x.__proto__ = new No()
f = x=>{while(x.__proto__);}

在线尝试!

编辑:有一些代表,所以这里是链接:Mozilla__proto__


我替你评论了警察。
斯蒂芬,

1
谢谢!也感谢大家的支持,我现在可以发表评论!
Haumed Rahmani

1
欢迎来到PPCG:D
Conor O'Brien


5

贾科·杜伯丹

function(x)if(is.list(x))return(1)

第一次贡献任何东西,所以一定要指出我在格式方面犯的任何错误。

相当确定这是有效的。只是重新包装is.list(),对不对?


顺便说一句,我没有代表对原版发表评论,因此如果有帮助,我们将不胜感激。
刑事

为您评论。
TheLethalCoder

不是预期的解决方案,但可以。做得好。
JAD

5

Javascript,程序员5000

最大字串长度

使用长度小于引擎支持的字符串。添加"h"到此字符串时,将引发错误。在线尝试!

function getAlmostMaxLenStr() {
  var prevBases = [];
  var base = "a";
  try {
    while(true) {
      prevBases.push(base);
      base += base;
    }
  } catch(e) {}
  for (var i = prevBases.length-1; i>=0; --i) {
    try {
      base += prevBases[i];
    } catch (e) {}
  }
  return base;
}
f(getAlmostMaxLenStr());

跨源块

@ jadkik94的回答启发很大,但无处不在。创建跨域iframe,然后传递.contentWindow所述iframe。由于跨域安全性,函数尝试使用该值时,此操作将失败。

let f=x=>{
  try {
    console.log(x+"h"); // we don't want to lock up your browser, do we ;)
  } catch (e) { console.log("Halted!\n",e); }
}
let iframe=document.createElement("iframe");
const url = location.host.indexOf("google") === -1 ? "https://google.com" : "https://stackexchange.com";
iframe.src=url;
iframe.onload=a=>f(iframe.contentWindow);
document.body.appendChild(iframe);

原始价值

.toString()答案的变体-只是使用它toPrimitive。它返回一个对象作为原始值,而Javascript不知道该对象如何处理(因此会引发错误)。在线尝试!

f({
  [Symbol.toPrimitive](){return {}}
});

干得好,但仍然不是解决方案!非常聪明!
程序员

4

Node.js,Adnan

{}{}或任意2个对象是两个输入。我什至不知道这是如何工作的。

这是JS惊人的对象比较逻辑:

console.log({} == {});
console.log({} === {});
console.log({} > {});
console.log({} < {});
console.log(!!{});

console.log({} >= {});
console.log({} <= {});


是的,这是预期的解决方案:)
Adnan


4

Javascript(NOT node.js),程序员5000

之所以不能添加,是因为它创建了一个没有toString的对象,因为new Set并不固有from的原型Object

输入:

new Set()

在线尝试!


这可能是预期的解决方案,从现在起,我将其保留在我的脑袋中:P
Stephen

抱歉,这似乎对我不起作用?在线尝试!
Haumed Rahmani

@HaumedRahmani添加了一个在线尝试按钮。我用蜘蛛猴,而不是通天塔。
格兰特·戴维斯

不是预期的解决方案,而是出色的工作!
程序员



4

Python 2,Foon

__import__("os")._exit(0)

基本上,它在锡罐上说的是。

在线尝试。


有趣的是,在TIO上对我来说超时了。在Windows下(特别是在winpty python inputbad.py并粘贴到该行中),它​​确实会按需退出...是的,我的schtict毫不奇怪地利用了“ Python 2下的输入确实在幕后”
Foon

@Foon Hmm,我的TIO工作正常。请参阅答案链接。
Veedrac

很奇怪...我一定是打过比赛,然后在我的TIO链接上输入了输入却没有意识到
Foon

我很确定这会
破坏

@enderland仅当他们评估您的输入时,大多数人才不会。
Veedrac '17


4

Python 3,Siphor

很好玩 我们需要通过type(x) != str检查,因此我们需要控制的返回值type()。我们必须重写该__class__属性,并用一个扩展名为的自定义对象替换该属性,该对象type__ne__方法替换为始终返回false的方法。这使它通过类型检查,但搜索将失败,因为o它不是str。

class m(type):
    def __ne__(a,b):
        return False
class c:pass
o=c()
o.__class__=m("",(c,),{})
f(o)

欢迎光临本站!:)
DJMcMayhem

4

C#,TheLethalCoder

System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

或任何其他可空类。



3

JS(ES6)

"   "

代码少于10的任何字符都可以使用;我在tab上面使用了一个字符,SE将其转换为空格。



抱歉:(另外,我认为您需要在字符串周围加引号以使它成为字符串
Stephen

@ programmer5000,所以我看到了:(
毛茸茸的

没问题,@ StepHen; 游戏的性质。我认为引号是隐式的,但我将对其进行编辑
。– Shaggy

@Shaggy我不知道该裁定是什么,但是它f(<tab>)是有效的语法(空输入)f(1)f("1")无论如何我们都必须加以区分
Stephen



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.