깨지기 쉬운 Quine


30

깨지기 쉬운 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>


HQ9 +가 허용됩니까?
Oliver Ni


3
이되는 언어 기능에 대한 가정을 만들기 - 모든 언어 "오류"가.
Mego

2
@Mego 무한 루프도 오류 대신 허용됩니다. 모든 튜링 완료 언어에는 무한 루프가 있습니다.
feersum

1
관련이없는 @Mego. 문제당 유한 부분 집합 만 적용되는 경우 왜 귀찮은 일이 발생합니까?
Conor O'Brien

답변:


6

해학적 인 ,32 28 25 바이트

{3SHWD{Je!}.+{Sh}\msh}Je!

여기에서 시도하십시오.

따라서 Burlesque의 대부분의 지침은 2 자입니다. 그리고 Marbelous보다 Burlesque에서 quine을 작성하는 것이 훨씬 쉽습니다. Je!또는 CJam의 ^^e!수단 _~.


1
잠깐만 ...이 골프를하지 않으면 (그리고 여기에서 가장 짧은 경우) 골프가 무엇인지 상상할 수 없습니다! +1
Daniel

@Dopapp 문제는 Burlesque에 명령이 너무 많아서 무언가를 놓친 것 같습니다.
jimmy23013

11

파이썬 3, 45 바이트

c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)

후행 줄 바꾸기를 쉽게 제거 할 수 있도록 Python 3으로 전환합니다.

나는 1 대신 2 개의 변수가있는 어리석은 구조로 시작했지만 1 변수로 전환하면 4 바이트가 짧아졌습니다.

Dennis의-(4 + 3) 바이트


주장에 대해 몰랐어요 좋은 일
파괴적인 레몬

2
설명을 추가하면 좋을 것입니다.
Sarge Borsch

exec%트릭 과 구조를 결합하면 c='print(end=len(c)%5*"c=%r;exec(c)"%c)';exec(c)48 바이트가 있습니다.
Dennis

1
c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)3 바이트를 더 절약합니다.
Dennis

7

파이썬, 91/92 67 바이트

이것은 재미 있었다!

이제는 주장에 대해 알고 있습니다.

s='s=%r;assert len(s)==34;print(s%%s)';assert len(s)==34;print(s%s)

문자열에서 문자가 제거되면 오류를 주장하십시오. 나는이 기능을 알고 있으면 더 빨리이 작업을 수행했을 것이다.


2
마지막 줄 바꿈 질문에 대해 잊어 버렸습니다 ... 카운터를 세면 안전하게 제거 될 수 있기 때문에 답변이 유효하지 않습니다.
feersum

7

파이썬 2, 51 50 46 바이트

lambda s='lambda s=%r:s[22:]%%s%%s':s[22:]%s%s

Ideone에서 확인하십시오 .


함수 퀴는 실제로 허용됩니다.
Conor O'Brien

1
응? 나는 quines으로 허용되는 함수에 대해 들어 본 적이 없다 ... 이것에 대한 예가 있습니까?
feersum

@feersum javascript quine 쿼리 는 몇 가지 결과를 산출합니다.
Dennis

@feersum 표준 Mathematica quine은 또한 함수 기반 (를 사용하여 #0)입니다.
Martin Ender

2
방금 다른 모양을 보였으며 대부분의 JS 또는 Mathematica quines도 실제로 함수를 호출합니다. 따라서 REPL quines이라고하는 것이 더 정확합니다. 즉,이 도전의 사양에서 Conor가 제공 한 예는 단지 기능이므로 적어도 여기에서는 유효하다고 생각합니다.
마틴 엔더

4

C #, 145 바이트

_=>{var@s="_=>{{var@s={1}{0}{1};for(;79!=s.Length;){{}}System.Console.Write(s,s,'{1}');}};";for(;79!=s.Length;){}System.Console.Write(s,s,'"');};

이전에 C #에서 퀴네를 쓰지 않았지만 골프에서 높은 점수가 더 낫습니다. :)

문자가 문자열에서 제거되거나 마법의 const 79에서 숫자가 제거되면 무한 루프. 다른 문자를 제거하면 컴파일 오류가 발생합니다.

언 골프 드 :

/* Action<object> Quine = */ _ => // unused parameter
{
    // String of the function (well, mostly).
    // {0} placeholder for s, so the output contains the function and string.
    // {1} placeholder for " since it requires escaping.
    var@s = "_=>{{var@s={1}{0}{1};for(;79!=s.Length;){{}}System.Console.Write(s,s,'{1}');}};";

    // Infinite loop if a char is removed from the above string or if the 7 or 9 is removed.
    for(;79!=s.Length;){}

    // Print the quine.
    System.Console.Write(s,s,'"');
};

3

자바 스크립트, 90 바이트

a="a=%s;a[44]!=')'?x:console.log(a,uneval(''+a))";a[44]!=')'?x:console.log(a,uneval(''+a))

Firefox 48 콘솔에서 작동하며 uneval및 다른 환경에서 작동해야합니다 console.log. 오류 분석 :

a="                                             "; [  ]!=' '?x:           (a       (''+a))   // SyntaxError
   a=%s;a[44]!=')'?x:console.log(a,uneval(''+a))  a 44    )                                  // ReferenceError from calling `x`
                                                               console.     ,uneval          // ReferenceError from calling `onsole.log`, `auneval`, etc.
                                                                       log                   // TypeError from calling `console.og`, etc.

와우, 언발에 대해 몰랐어요. 또한, 적어도 당신을 다시 만나서 반갑습니다! : D
코너 오브라이언

@ ConorO'Brien (적어도 다소) 돌아온 것이 반갑습니다! 이 기술을 사용하여 몇 가지 멋진 답변 을 게시했습니다 .
ETHproductions

2

파이썬 2, 59 바이트

x='x=%r;1/(len(x)==30);print x%%x';1/(len(x)==30);print x%x

이것은을 던져 ZeroDivisionError, 0 경우 (3), 또는 문자가 문자열에서 제거됩니다. 다른 문자를 제거하면 a NameError또는 a가 SyntaxError됩니다.


2

배나무 , 50 바이트

a="print('a='.repr(a).';eval(a)');#f+QF>";eval(a)

온라인으로 사용해보십시오!

최단 답변은 아니지만 상당히 포괄적 인 답변입니다. 이 프로그램에서 문자를 삭제하면 체크섬이 실패하여 A Pear Tree 인터프리터가이를 실행하지도 않습니다. 예를 들어, 후행 줄 바꿈을 삭제하면 오류가 발생합니다.;#f+QF> 는 전체적으로 프로그램의 CRC-32가 0이고 ( f+QF>가능한 3 바이트 문자열 중 하나가 ASCII에 머무르는 동안 달성하기위한 의견; ASCII를 사용하는 것이 중요 repr합니다. 그렇지 않으면 올바르게 왕복하지 못하기 때문 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.