깨지기 쉬운 Quine
깨지기 쉬운 퀴는 평가할 때 단일 문자를 제거하여 만든 각 하위 문자열을 갖는 속성을 만족시키는 퀴니로, 오류가 발생합니다.
예를 들어. 프로그램 asdf
이 퀴인 경우 프로그램 이 깨지기 쉬운 경우 다음 프로그램에서 오류가 발생해야합니다.
sdf
adf
asf
asd
프로그램과 모든 하위 문자열은 완전히 결정적이어야하며 동일한 언어 여야합니다. 결국 오류를 일으키지 않더라도 무한 루프에 빠지는 프로그램 (즉, 종료 실패)은이 문제의 목적을 위해 "오류를 생성"하는 것으로 간주됩니다.
일반적인 퀴인 제한을 포함하여 표준 허점이 적용됩니다 (예 : 자체 소스 코드를 읽을 수 없음).
예를 들어, 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")
따라서 깨지기 쉽지 않습니다.
quines에 대한 중요 사항
합의 에 따라 가능한 모든 quine은 다음을 충족해야합니다.
프로그램의 다른 부분을 인코딩하는 프로그램의 섹션을 식별 할 수 있어야합니다. ( "다른"은 두 부분이 다른 위치에 나타남을 의미합니다.)
또한 퀴인은 직접 또는 간접적으로 자체 소스에 액세스해서는 안됩니다.
예
JavaScript의 함수 #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>