양방향 Quine Chain


9

PPCG에는 이미 충분한 양의 퀴네가 없었습니다 ...

도전:

당신의 임무는 프로그램 "A0"을 만드는 것입니다. 이 프로그램이 입력없이 실행되면 아무것도 출력하지 않습니다. 이 프로그램을 입력으로 실행하면 "A1"이 출력됩니다. 입력없이 "A1"을 실행하면 "A0"이 출력됩니다. "A1"이 입력 상태에서 실행되면 "A2"가 출력됩니다. "A (k)"는 입력없이 실행하면 "A (k-1)"을 출력하고 입력으로 실행하면 "A (k + 1)"을 출력합니다.

세부

나는이 도전이 충분히 간단하다고 믿는다. 실제로 다른 규칙은 없습니다. 그런데 모든 프로그램에는 최소한 1 바이트가 포함되어야합니다. 입력이 ASCII 문자로만 구성되어 있다고 가정 할 수 있으며 원하는 경우 공백을 무시할 수 있지만 특정 입력을 지정할 수는 없습니다. 출력은 STDOUT 또는 STDERR이 될 수 있지만 모든 프로그램은 동일한 것으로 출력되어야합니다. 다른 하나는 텍스트를 포함 할 수도 있습니다 (따라서 STDOUT으로 출력 한 다음 오류와 함께 종료 될 수 있음). 지적 해 주신 @Dennis에게 감사드립니다.

모든 프로그램은 동일한 언어로 작성되어야하며 각 프로그램은 나머지 언어와 고유해야합니다.

점수는 프로그램 "A0"의 길이와 같습니다. 이것이 코드 골프 도전이므로 최저 점수가 이깁니다!


하나의 문자로 다른 내가 A (k)를하고있을 것이다 대부분의 제출을 예측하기 슬프다 (K + 1) :( 성장하는 문자열에 추가
Sparr

@Sparr 불행하게도, 아마도 그 일이 일어날 것입니다. :( 아 글쎄, 난
그것에

내가 이것을 올바르게 해석하면 나는 두 가지 중 하나만 출력 할 수 있습니다 . 원하는 출력을 STDOUT으로 인쇄하면 STDERR이 비어 있어야합니까? 오류와 함께 종료 할 수 있기 때문입니다.
데니스

모든 프로그램이 달라야합니까? 질문은 그렇지 않습니다.

4
또한 "Bidirectional Quine Chain"과 같이 좀 더 표현적인 제목을 제안해도 될까요? "슈퍼 메타 퀴닌"은 다른 프로그램을 인쇄하는 프로그램을 넘어서는 말을 많이하지 않으며 앞으로이 문제를 찾기가 더 어려워 질 것입니다.
Martin Ender 2012

답변:


1

, 28 바이트

V Y"I#qSti0+i?`V Y`.RPyRtiu"

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

설명

이것은 가장 짧은 알려진 Pip quine의 수정 된 버전입니다 V Y"`V Y`.RPy". 그 quine은 문자열을 정의하고 y변수에 넣은 다음 평가하여 작동합니다. 평가 될 때 문자열은 repr y(따라서 y큰 따옴표로 묶음)을 취하고 패턴 리터럴 `V Y`을 문자열 앞에 연결 합니다.

우리의 전략은을 넣어하는 것입니다 0후, 프로그램에 교체 010입력이 있다면, 또는 교체 100아무런 입력이 없었다합니다. (따라서 A ( k )에는 k 1 0과 0 으로 구성된 숫자가 포함 됩니다.) 이러한 값을 가진 10내장 변수 ( it, 각각) 가 있기 때문에 편리 합니다. 따라서 실제 숫자를 사용하지 않고 참조 할 수 있습니다. .

따라서 대신에 입력이 있었는지 여부 RPy를 원합니다 . 우리는의 값을 교환함으로써 두 경우를 결합 할 수 있습니다 및 입력 (있는 경우 ), 다음 일을 . (우리는 시험이 의 길이 입력이 좋아하기 때문에, 입력의 falsey 있습니다.)RP yRitRP yRtitiI#q StiRP yRti#q0

이제 0코드에서 리터럴을 가져 와서 출력을 생성하지 않는 A0의 특수한 경우를 처리해야합니다. 둘 다 거짓 인 경우 테스트 0+i하고 반환 하여 해결할 수 있습니다 u.

  • 임의의 경우 K > 0, A (의 개수 k는 ) 제로가 될 것이다 (예를 따라서 truthy 110+i).
  • 들면 K = 0, A (의 수 K가 ) 0이된다 :
    • 이 입력, 경우 it교환하고 i있다 (10)는 0+i여전히 truthy입니다.
    • 입력이 없으면 i여전히 0이며 0+i거짓입니다. quine core 대신 unil을위한 내장 변수 인을 출력 합니다. nil을 인쇄하면 출력이 없습니다.

잘 했어! 매력처럼 작동합니다.
HyperNeutrino

1

파이썬 2, 93 바이트

후행 줄 바꿈이 있습니다.

p=1+2*bool(input())-1;s='print"p=%r+2*bool(input())-1;s=%r*(p>0);exec s"%(p,s)'*(p>0);exec s

입력으로 사용해보십시오 | 입력하지 않고 사용해보십시오

이것은 비슷한 질문에 대한 내 대답 에서 수정되었습니다 .

입력이 있으면 증가 p합니다. 그 결과 프로그램이 될 것입니다 그래서 p=2+..., p=3+...


이것은 0을 입력으로 인식하지 않습니다
fəˈnɛtɪk

@LliwTelracs 입력은 따옴표로 묶어야합니다 (이는 따끔해야합니다). 답변에서 하이퍼 링크를 참조하십시오.
mbomb007

그대로, 프로그램은 문자열과 0 이외의 모든 숫자로 작동합니다.
fəˈnɛtɪk

1
@LliwTelracs 그렇다면 숫자를 사용하지 마십시오. 컨센서스에 따르면을 사용 input()하는 대신 입력을 따옴표로 묶고 사용해야 할 수 있습니다 raw_input(). 0을 입력하려면을 사용하십시오 "0".
mbomb007

좋은 해결책! 나는 대부분의 답변이 무한히 길어질 것으로 기대했다 (기술적으로는 같은 의미는 아니지만). 잘 했어!
HyperNeutrino
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.