脆弱的奎因
脆弱的quine是满足通过删除单个字符来组成每个子字符串的属性的quine,在评估时会产生错误。
例如。如果您的程序asdf
是木盒,那么它就很脆弱,以下程序必须出错:
sdf
adf
asf
asd
您的程序(及其所有子字符串)必须是完全确定性的,并且必须使用相同的语言。就此挑战而言,即使最终未产生错误,陷入无限循环(即无法终止)的程序也被视为“产生错误”。
存在标准漏洞,包括通常的quine限制(例如,无法读取自己的源代码)。
例如,print("foo")
不是脆弱的。所有这些子字符串必须出错:
rint("foo")
pint("foo")
prnt("foo")
prit("foo")
prin("foo")
print"foo")
print(foo")
print("oo")
print("fo")
print("fo")
print("foo)
print("foo"
不会出错的是:
print("oo")
print("fo")
print("fo")
因此它并不脆弱。
关于藜的重要说明
通过协商一致,任何可能的奎纳必须满足以下条件:
必须有可能识别程序的一部分,该部分对程序的不同部分进行编码。(“不同”表示两个部分出现在不同的位置。)
此外,木盒不得直接或间接访问其自身的源。
例
由于我认为JavaScript的function#toString是“正在读取其自身的源代码”,因此我不允许这样做。但是,如果我不想禁止它,那么这是JavaScript中的一个脆弱的方法:
f=(n=b=`f=${f}`)=>(a=(n)==`f=${f}`,n=0,a)&(n!=b)?b:q
测试仪
这是一个程序,在给定程序源代码的情况下,它会生成所有必须出错的程序。
let f = (s) =>
[...Array(s.length).keys()].map(i =>
s.slice(0, i) + s.slice(i + 1)).join("\n");
let update = () => {
output.innerHTML = "";
output.appendChild(document.createTextNode(f(input.value)));
};
input.addEventListener("change", update);
update();
#output {
white-space: pre;
}
#input, #output {
font-family: Consolas, monospace;
}
<input id="input" value="print('foo')">
<div id="output"></div>