n 레벨 우로 보로스 퀸


11

이 128 개 언어 퀴 노우로 보로스 (다른 언어로 프로그램을 출력하는 프로그램, 또 다른 언어로 프로그램을 출력하는 프로그램 (125 개 언어), 원래 프로그램을 출력하는 프로그램)는 매우 인상적입니다. 그러나 불행히도 정적 반복 횟수가 있습니다.

프로그램을 출력하는 프로그램 (다른 언어로 번역 할 필요는 없지만 가능할 수 있음)을 작성하는 프로그램을 작성하십시오. 프로그램을 출력하고 프로그램을 출력하는 등의 작업이 반복 된 후 처음으로 원래 프로그램 출력합니다 (즉, 중간체 없음). 프로그램은 원본과 동일해야합니다. 그렇지 않으면 입력을 무시하는 quine이 작동합니다.) 여기서 n은 입력으로 제공된 음이 아닌 정수입니다. 입력은 원래 소스 코드의 숫자 일 수 없으며 (예 : x = <the value of n>프로그램 시작시) 다음 중 하나 여야합니다.

  1. 명령 줄 인수로 전달
  2. 표준 입력에서 읽기
  3. 새 프로그램을 반환 / 출력하는 함수에 인수로 전달됩니다.

우로 보로스의 중간 단계의 경우 프로그램은 완전한 기능을하는 프로그램이거나 인수가없는 함수일 수 있습니다.이 함수는 호출되면 다음 프로그램을 반환 / 출력합니다.

소스 파일 자체를 읽거나 quine과 같은 내장을 사용할 수는 없습니다 (이 작업을 수행 할 수있는 방법은 없다고 생각합니다)

명확히하려면 n = 0프로그램이 자체 소스 코드를 출력해야합니다.

인 경우 n = 1프로그램은 다른 프로그램을 출력해야합니다. 그러면 원래 소스 코드가 출력됩니다.

등등...

가장 적은 바이트가 이깁니다!

편집하다:

"우로 보로스의 중간 단계에서 프로그램은 입력이없는 완전한 기능을하는 프로그램 이거나 인수가없는 함수일 수 있습니다." 프로그램이 체인에서 다음 것을 출력하면 입력 기다립니다. 괜찮지 만 프로그램은 원래 값 n을 필요로하지 않습니다.



인덱스 n을 1 개 할 수 있습니까? 따라서 n = 1은 인쇄 소스 코드를 의미하고, n = 2는 소스 코드 등을 인쇄하는 인쇄 코드를 의미합니다.
Expired Data

1
반복 버전에 여전히 초기 입력이 있습니까? 첫 번째 입력이 3이라고 가정하고 출력하는 프로그램을 실행합니다. 여전히 입력 3이 있습니까, 아니면 전혀 입력이 없습니까? 입력이 없으면 입력이없는 것과 같은 getInput()것이 사용되는 경우 처리해야한다고 생각합니다 . 또는 나중에 반복에 사용되지 않는 임의의 것을 입력하여 getInput()? 일명 현재 파이썬 답변이 유효합니까?
Kevin Cruijssen

정수가 주어지면 nouroboros quine n반복 의 "초기 프로그램"인 프로그램을 출력 하고 우리의 대답이 n반복 중 하나로 간주되어서는 안된다고 생각합니다 . 이 올바른지?
아웃 골퍼 에릭

@KevinCruijssen 나는 아마 그것에 대해 더 분명했을 것입니다. 중간 단계는 어떤 형태로도 입력 할 수 없습니다. 프로그램이 다음 출력을 출력 한 다음 입력을 기다리면 괜찮을 것 같습니다.
레오 Tenenbaum

답변:


5

05AB1E , 28 바이트

Kevin Cruijssen 덕분에 -4 바이트 + 수정

"34çìD«s<©di®ì"34çìD«s<©di®ì

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


설명

이것은 코드 앞에 인쇄하기 위해 나머지 숫자를 추가하여 작동합니다. 즉, 입력과 같은 방식으로 스택에 추가됩니다. "0"을 입력하는 경우에는 앞면에 0이 연결되지 않습니다.


d양수 ( >=0) 대신 음수가 아닌 ( >0)입니다. 문제는 d팝업하지 않고 확인하려면 먼저 복제해야하지만 반복시 폐기해야 0"quinsting"한다는 것 0입니다. 그렇지 않으면 복제 된을 출력합니다 . :(
Kevin Cruijssen

"34çìD«s<©di®ì"34çìD«s<©di®ì아마 28 바이트 (아직 의도 한 접근 방식에 여전히 가깝습니다)? ( 중복 사본의 반복 0"34çìD«s<Ddiì"34çìD«s<Ddiì출력에 대한 현재 버전 -1D두렵습니다.)
Kevin Cruijssen

4

룬 마법 , 39 바이트

"3X4+kSql1=c*?S:1-}C'LA-}!i:0)2*?~!'´@

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

보다 작거나 같은 입력이있는 경우 동일한 전술을 사용하여 05AB1E보다 4 바이트 더 짧을 수 있습니다 10. 그러나 임의로 큰 값을 지원해야하므로 더욱 복잡해집니다.

의 숫자 값은 n앞에 배치되고을 사용하여 연속 숫자 리터럴로 구문 분석됩니다 ´. "3X4+kSq기본 quine 코드입니다. 앞에 값이 없으면 스택 길이는 1 (퀴인) 만됩니다. 그렇지 않으면 2 l1=d*?는 처리 방법을 결정합니다.

  • 값이 있으면 S:1-}'LA2+-}실행 : 스왑 가기 값, 로그 얻을, 스택 하단의 사본을 떠나, 그것을 복제, 1 빼기 10 그 값 시간의 100 (값의 자신의 문자 길이의 결과로, 플러스 1 ´의 경우 문자열 끝에서 많은 문자를 제거합니다 ( 필요하지 않은 위치 잘못된 값이 있기 때문에 끝에서 효과적으로 잘림 ). C1 바이트보다 짧아서 2+같은 값이됩니다.

  • 값이 없으면 입력에서 값을 읽습니다.

여하튼 : :0)2*?복제하고 0과 비교하십시오.

  • 0이 아닌 경우를 누릅니다 ´.

  • 0이면 값을 팝하십시오. 첫 번째 바이트를 실행하려고하면 숫자가 !아니며 즉시 동일한 위치에서 숫자 모드에서 빠져 나오기 2?때문에 바이트 대신 치트를 사용 하고 저장할 ´수 있습니다.

전체 스택을 위에서 아래로 인쇄하십시오.


3

자바 10, 145 바이트

n->{Long N=n;var s="n->{Long N=%s;var s=%c%s%2$c;return s.format(s,N>0?N-1+%2$cL%2$c:%2$cn%2$c,34,s);}";return s.format(s,N>0?N-1+"L":"n",34,s);}

온라인으로 시도일부 반복의 출력을 참조 .

설명:

설명 :

  • var s포맷되지 않은 소스 코드를 포함
  • %s 이 문자열을 자체에 넣는 데 사용됩니다. s.format(...)
  • %c, %1$c34큰 따옴표의 형식을 지정하는 데 사용됩니다
  • s.format(s,34,s) 다 합쳐

도전 과제 :

첫 번째 람다 함수는 long입력을 매개 변수로 사용합니다.

  • 이것은 Long N=n;첫 번째 반복 에서 변수 로 설정됩니다 . 또는 Long N=%s;다음 반복 을 위해.
  • 삼항 검사는 N>0?N-1+"L":"n"이를 채울 %sN-1으로 추가, L그것은 긴과에 대한 문자열로 변환을 이후 %s경우, N1. 경우보다 더 큰는 N대신에 0 (초기 입력했다 0거나이 '는 interquine-의 마지막 반복이다 loop '), 대신 %s초기 값으로 채 웁니다 n.

스펙은 중간 출력이 인수가없는 전체 프로그램 또는 함수 여야한다고 말합니다
무지의 구현

제가 알고있는 무지의 구현입니다. 제 람다 함수가 얻어 long함수 파라미터를, 다른 람다 함수가 수행 되지 않는 Void파라미터 I는 항상 때문에 어떠한 입력을하지 진술서 도전 사용하여 v->보다 짧은 1 바이트이다 ()->.
Kevin Cruijssen

2

하스켈 , 195164 바이트

main=putStr(x++show x++"\na=")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr
x="main=putStr(x++show x++\"\\na=\")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr\nx="
a=0

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

이것은 매우 간단한 quine 기술을 사용합니다. a숫자로 설정된 변수로 수정합니다 . 만약 그 숫자가 제로 (시작에있는 경우) a이면 입력을 받고 입력 숫자 로 설정된 소스를 출력합니다 . a0이 아닌 경우 소스 a를 1 로 설정하여 출력합니다 . 이렇게 a하면 원래 소스를 출력하기 전에 0 으로 카운트 다운됩니다.




1

펄 6 , 44 바이트

<say '<',S{\d+}=get||0-1,'>~~.EVAL'>~~.EVAL

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

표준 입력을 통해 입력을 받고 변경된 유일한 항목이 첫 번째 숫자 인 프로그램을 반환합니다. 이후의 각 프로그램은 그 수가 감소 된 것을 제외하고는 동일한 프로그램을 출력합니다.


1

C # (Visual C # 대화식 컴파일러) , 112 바이트

void f(int n=-1){var s="void f(int n={2}){{var s={0}{1}{0};Write(s,(char)34,s,n-1);}}";Write(s,(char)34,s,n-1);}

@NickKennedy 덕분에 많은 바이트를 절약했습니다!

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


중간 출력은 전체 프로그램이 아니며 단일 인수를 취하는 함수가 아닙니다. 또한 나는 당신에게 ns가 있어야 한다고 생각합니다 l. 어때요 tio.run/##Sy7WTS7O/P@/…
Nick Kennedy

1

Python 3.8 (시험판) , 60 56 55 53 바이트

lambda n=-1,s='lambda n=%d,s=%r:s%%(~-n,s)':s%(~-n,s)

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

Jo King 덕분에 -2 바이트

53 바이트 버전에서 Python 2 및 Python 3에서도 작동합니다.


중간 함수는 완전한 프로그램 또는 인수를 사용하지 않는 함수 인 것 같습니다.
Nick Kennedy

그 해마 연산자 :=는 파이썬에 환영받는 추가 기능입니다.
mbomb007

"우로 보로스의 중간 단계에서 프로그램은 완전한 기능을하는 프로그램이거나 인수가없는 함수일 수 있습니다.이 함수 호출 될 때 다음 프로그램을 반환 / 출력합니다."
mbomb007

@NickKennedy 사양을 준수하도록 업데이트되었으며 우연히 4 바이트를 저장했습니다.
부정 7 7

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