규칙적인 퀴인 오류 (또는 경고) 퀴 [닫힘]


9

( 오래된 질문에 대한 이 의견 에서 영감을 얻었습니다 .)

배경

오류 quine (또한 "Kimian quine"로 알려진)는 컴파일 또는 실행할 때 발생하는 프로그램입니다 컴파일러 / 통역 / 런타임 동일한 프로그램 자체에 텍스트, 아무것도이있는 에러 메시지를 출력합니다. 이 도전의 목적을 위해, 우리는 경고를 포함하기 위해 "오류"를 광범위하게 정의하고 있습니다.

직무

이 도전에서 우리는 찾고 있습니다 이것은 또한 오류 quine입니다. 실행될 때 프로그램은 자체 소스 코드를 정상적으로 인쇄해야합니다 (예 : 오류 / 경고 메시지가 아님). 이것은 적절한 quine 이어야합니다 (즉, 프로그램의 일부는 출력의 다른 부분을 인코딩해야합니다). 또한, 컴파일하고 프로그램이 있어야 실행 또한 프로그램의 소스 코드의 원인 - 그리고 아무것도를 - 오류로 인쇄하거나 구현에 의해 경고 메시지. 즉, 프로그램이 정상적으로 실행되지 않는 언어에서는 컴파일 타임 오류를 사용할 수 없습니다. 즉, 프로그램의 소스 코드는 각 방법을 통해 한 번씩 두 번 인쇄됩니다.

설명

  • 대부분의 경우 오류 / 경고 메시지가 무엇이고 그렇지 않은 것이 분명합니다. 우리는 여기서 두 가지를 구별하지 않습니다. 모호한 경우, 구현에 의해 출력되는 텍스트로 오류 / 경고 메시지를 정의하십시오. 1. 명령을 실행하는 것 이외의 결과 (또는 언어에서 가장 가까운 것이 무엇이든); 또는 2. 출력으로 생성 한 명령 입력의 일부가 아닙니다.
  • quine의 오류 / 경고 부분은 적절한 quine 일 필요는 없습니다 (대부분의 경우 대부분의 오류 및 경고 메시지에는 상당한 양의 고정 텍스트가 포함되어 있기 때문에 우연히 발생합니다).
  • 프로그램이 여러 오류 / 경고를 출력하는 것은 허용되며, 이는 함께 연결될 때 프로그램의 소스를 형성합니다. 소스에 나타나지 않는 오류 / 경고를 출력하는 것은 허용되지 않습니다.
  • 많은 문제와 달리 컴파일러에 제공된 스위치와 프로그램 파일 이름은이 문제와 관련이있을 수 있습니다. 다른 방법으로는 도전이 불가능할 수 있으므로, 여기서는 융통성이 있지만 기꺼이 구현을 실행하는 경우 PPCG 규칙에 따라 바이트 벌금이 부과됩니다 (추가 문자 수와 동일). 프로그램을 실행하는 가장 짧은 "일반적인"방법으로 명령 행에 추가해야합니다. 따라서 게시물에서 페널티의 크기를 지정해야합니다. 예를 들어, 사용하는 인터프리터가 파일에서 프로그램을 읽고 파일 이름에 특별한 제한이없는 경우 프로그램을 실행하는 가장 일반적인 방법은 파일 이름이 1자인 파일에서 시작하는 것입니다.
  • 사용하는 컴파일러 / 인터프리터 버전은 관련이있을 수 있으므로 제출할 때 프로그램이 작동하는 특정 컴파일러 또는 인터프리터 및 필요한 버전을 명시하십시오. 예를 들어 C 제출은 헤더에 "C (gcc 6.2.0)"라고 표시 될 수 있습니다.
  • 이 작업이 모든 언어로 가능한 것은 아닙니다. 언어가 가장 쉬운 언어에서 가장 쉬운 방법은 오류 메시지 나 경고 메시지를 찾는 것입니다. 오류 메시지 나 경고 메시지는 텍스트의 일부를 사용자 정의 할 수 있습니다 (메시지에 인용되는 이름을 변경하여 파일 이름을 선택하는 것이 일반적 임) 여기에 있지만 유일한 것은 아닙니다). 누군가 텍스트가 수정 된 오류 및 경고 메시지 사용 하여이 작업을 수행 할 수있는 방법을 찾으면 특히 감동받을 것 입니다.

승리 조건

이것은 도전 과제이므로 바이트 수가 더 적은 항목이 더 나은 것으로 간주됩니다. 따라서 프로그램이 작동하게되면 가능한 한 바이트 수를 줄 이도록 프로그램을 최적화하려고합니다. (단, 이미 다른 언어로 된 항목이 이미 짧은 경우에는 실망하지 마십시오. 우리가 실제로 찾고있는 것은 가능한 한 특정 프로그램이나 알고리즘을 최대한 단축하는 것이지만 여러 항목을 보는 것입니다 다른 언어로 된 솔루션이나 다른 원칙에 의존하는 솔루션은 항상 가치가 있습니다.)


2
내가 채팅에서 말했듯이, 첫 번째 글 머리 기호가 불분명하다고 생각합니다. 대부분의 경우 오류 / 경고 메시지가 무엇이고 무엇이 아닌지는 명백 하며 토론과 언어 변호사의 출발점 역할을합니다.
Dennis

@Dennis : 저는 상황이 좋지 않다는 원칙에 동의하지만, 다른 한편으로는이를 개선 할 구체적인 방법을 생각할 수 없습니다. 명백히 오류 메시지 인 것들에 대한 예외를 제거하면 일부 언어에서 의도하지 않은 상황으로 이어질 수 있으며, 이는 치료하는 것보다 더 많은 손상을 야기 할 수 있습니다. 당신이 질문을 개선 할 수 있다고 생각한다면, 나는 편집되고있는 것에 반대하지 않습니다. (그리고 PPCG에 관한 질문이 어쨌든 "소유권"을 가져야한다고 생각하지 않습니다.)

그대로, 나는 그 질문이 불분명하고 객관적인 타당성 기준이 부족하다고 생각합니다. 제안 된 변경으로 인해 상황이 더 악화 될 수 있음에 동의합니다. 가능한 한 가지 행동은 도전을 보류하고 샌드 박스에 다시 게시하는 것입니다.
Dennis

1
나는 지금 도전을 보류했다. 샌드 박스에 다시 게시 해 보시기 바랍니다. 그것은 매우 흥미로운 아이디어이며, 낭비하게 만드는 것은 부끄러운 일입니다.
Dennis

1
샌드 박스 게시물이 여기에 있습니다 . (문제를 편집하는 것을 고려하고 있었지만 게시물을 다시 열기 대기열에 넣었습니다. 문제가 해결 된 경우 다시 열기가 더 어려워

답변:


9

자바 스크립트 (Firefox 50), 153 바이트

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})

설명

여기서 아이디어는 내가 찾은 가장 쉽게 수정 가능한 JS quine 으로 시작하는 것입니다.

".replace(/.+/,x=>alert(uneval(x)+x))".replace(/.+/,x=>alert(uneval(x)+x))

throw키워드가 아니라 자신의 코드를 던져 만들 수있는 간단한 방법입니다 :

".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})

그러나 약간의 문제가 있습니다. Firefox는 메시지를 앞에 추가합니다 Error:. 다행히도 Error: mycode실제로 유효한 JavaScript입니다! (자세한 내용은 MDN을 방문하십시오 .)

Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})

죄송합니다. 잘못된 알림입니다.

".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: 

따옴표는 더 이상 코드 시작 부분에 uneval(x)+x없으므로 정확한 결과를 제공하지 않습니다. 이 문제를 해결하는 가장 좋은 방법은 중첩 문자열 대신 자리 표시자를 추가하는 것입니다.

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x})

어, 이제 Error:오류 메시지에 추가 내용 이 있습니다. 문자열을 잘라서 수정 해 봅시다 :

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})

마지막으로 출력과 오류 메시지는 코드와 동일합니다! 스택 스 니펫을 추가했지만 브라우저의 스 니펫에서 작동하지 않는 것 같습니다.


5

파이썬 2, 217 80 51 바이트

후행 줄 바꿈이 필요합니다.

s='s=%r;print s%%s;exit(s%%s)';print s%s;exit(s%s)

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

나는 간단한 quine으로 시작했다.

s='s=%r;print s%%s';print s%s

그런 다음 끝에을 추가 raise했습니다 IOError.

s='s=%r;print s%%s;raise IOError(s%%s)';print s%s;raise IOError(s%s)

불행히도, 역 추적은 문제를 일으켰고 (완전히 지울 수 없었습니다), IOError: <code here>역 추적을 제거하더라도 예외 이름은 항상 앞에 인쇄됩니다 .

그런 다음이 유용한 SO 답변을 발견 하고 내 목적을 위해 수정했습니다.

그런 다음 자신의 클래스 만들기를 건너 뛸 수 있고을 사용할 수 있으므로 sys.exit코드가 훨씬 짧아집니다.


1
나는 이것이 명령을 실행하는 것 이외의 결과가 아니거나 출력으로 생성 한 명령에 대한 입력의 일부가 아니기 때문에 챌린지 사양의 오류 정의를 준수한다고 생각하지 않습니다 . 즉, 평범한 exit것은 여기서 잘 작동합니다. 필요 없습니다 sys.
Dennis

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