자체 성장 코드 코덱 코디 코덱


41

실행될 때 P1보다 정확히 1 바이트 더 긴 동일한 언어의 다른 프로그램 P2를 출력하는 프로그램 (또는 함수) (P1이라고 함)을 작성하십시오.

프로그램 P2가 실행될 때 P2보다 1 바이트 긴 세 ​​번째 프로그램 P3을 출력해야합니다. P3은 P3보다 1 바이트 더 긴 프로그램 P4를 출력해야합니다. P5, P6, ..., P∞와 동일합니다.

프로그램 체인은 무기한 또는 통역사가 더 이상 처리 할 수없는 장소로 이동해야합니다 (그러나 언어 적으로 이론적으로 유효한 프로그램으로 유지되어야 함)

규칙

  • 금지 된 표준 허점
  • 체인의 모든 프로그램은 한 언어로되어 있어야합니다
  • 입력이 없습니다. 출력이 stdout 또는 함수 반환 값으로 이동
  • 일정 기간이 지나면 프로그램이 종료되어야합니다. 특정 시간대 이후에 출력 생성을 중지하지만 종료되지 않는 프로그램은 자격이 없습니다

각 언어에서 가장 짧은 프로그램 P1이 이깁니다!


2
@ Οurous 무엇 ??? 태그를 직접 추가하지 않았습니다 ...
iBug

6
@iBug 어쨌든 제출물은 자체 소스 코드를 읽을 수 있습니까?
Martin Ender

3
@iBug "quine"태그는 기본적으로 금지되어 있으며 일반적으로 답변을 더 흥미롭게 만듭니다. 그래도 당신에게 달려 있습니다.
Martin Ender

1
"puts <<2*2,2\nputs <<2*2,2\n\n2"루비에서 반복 할 때마다 2 씩 증가합니다. 더 좋은 것을 찾을 수 없었습니다. :-/. 재미있는 도전!
Eric Duminil

답변:


28

자바 스크립트 (ES6), 14 12 바이트

@Shaggy 덕분에 -2 바이트

f=_=>"f=_"+f

스 니펫 테스트


그것을 발견하기 위해 잠깐만 걸렸습니다. 교활한!
얽히고 설킨

4
누군가 설명해 주시겠습니까? 머리를 감쌀 수는 없습니다. 어떻게 증가합니까?
htmlcoderexe

2
@htmlcoderexe "f=_"_매개 변수 이름 앞에 여분을 추가하여 반복 할 때마다 길이가 늘어납니다.
허먼 L

9

ASCII 7 바이트, 4 바이트

1603

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

7은 일반적으로 ASCII로 인코딩되지 않지만 이번에는보다 편리한 인코딩이므로 3 비트가 아닌 각 실행마다 1 바이트를 추가합니다.

또한 이것이 부정 행위로 간주되는지 확실하지 않습니다. (여러 가지 방식으로 경계선을 가로 지르는 7 quine이 바람을 피우고 있는지 여부는 불분명합니다.) 0인코딩 을하는 적절한 주장을 할 수 6있지만 일반적으로 결과 문자가 어디에서 나오는지 확실하지 않습니다. "는 7 개에 매우 기괴하고 암묵적인 행동이 많기 때문입니다.

이 프로그램은 1추가 된 상태로 인쇄 되며 여러 개의을 추가하더라도 그렇게 1합니다. 주석 처리 된 디버그 추적은 160311다음 과 같습니다.

|| 160311      Initial data ||; initial program 160311
||7 60311      1 command = append 7 to data
|1 0311        6 command = escape from the last | onwards (7 escapes to 1)
|16e77         0311 commands = append 6e77 to data
|16e77 16e77   Implicit (program is empty): copy data past last | to program
|16e777 6e77   1 command = append 7 to data
71603111 e77   6 command = escape from the last | onwards
71603111 e77   e7 command = output in same encoding as the source

( |프로그램에 남은 것이 없으므로 e프로그램을 부작용으로 즉시 종료합니다. 즉, 최종 7프로그램이 실행되지 않습니다).

모든 문자가 어디에서 오는지에 대한 기본적인 혼란은 7의 대부분의 명령이 실행될 때 데이터를 6생성 한 다음 주어진 데이터 조각을 생성하는 일련의 명령을 재구성하려고 시도한다는 것입니다. 이것은 종종 원본에 가깝지만 동일하지는 않습니다. quining 목적을 위해 일반적으로 결과가 거의 동일하고 일반적으로 선행 또는 후행과 다른 방식으로 7 프로그램을 작성합니다 7. 예를 들어 1데이터 716에서는 가장 쉬운 방법입니다 1현재 데이터 문자열로. 우리는 원래 16다른 (그러나 비슷한) 문자 시퀀스로 그것을 생성하여 파괴적으로|데이터가 시작된 마커. (나는 이것이 문자 그대로의 quine이 아니라는 가장 좋은 주장은 출력이 입력과 다르다는 것입니다!)


9

하스켈 , 74 66 바이트

편집하다:

  • -2 이용하여 바이트 H.PWiz <>후, -6을 이동 (10*)<$>.

이제 새로 무료 <>연산자를 사용합니다 ( Semigroup곱셈, 가져 오기없이 작동하려면 GHC 8.4 필요).

main=putStr$fst<>show$(10*)<$>("main=putStr$fst<>show$(10*)<$>",1)

온라인으로 사용해보십시오! (TIO에 아직 GHC 8.4가 없기 때문에 가져 오기로 치트합니다.)

작동 원리

  • main=putStr$ 다음 문자열 값을 출력하는 상용구입니다.
  • fst<>show튜플을 가져 오는 함수이며 튜플의 문자열 표현과 연결된 튜플의 첫 번째 요소로 구성된 문자열을 반환합니다. 즉

    (fst<>show)(s,t) = fst(s,t)<>show(s,t) = s++show(s,t)
  • (10*)<$>다음 튜플 의 마지막 요소에 10을 곱하여 숫자 0를 문자열 표현에 추가합니다 .


1
다음을 사용 하여 최소 2 바이트 를 저장할 수 있습니다.(<>)
H.PWiz

@ H.PWiz 감사 (10*)<$>합니다.
Ørjan Johansen





4

brainfuck , 420 바이트

->+++>>+++>+>++>+++>+>+>+++>>>>>>>>>>>>>>>>>>>>+>+>++>+++>++>>+++>+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>+>>+++>>+++>>>>>+++>+>>>>>>>>>++>+++>+++>+>>+++>+++>+>++>>+++>+>+++>+>++>+++>>>+>+>++>+++>+>+>>+++>>>>>>>+>+>>>+>+>++>+++>+++>+>>+++>>>+++>+>++>+++>++>>+>+>++>+++>+>+>>+++>>>>>+++>+>>>>>++>+++>+++>+>>+++>>>+++>+>+++>+>>+++>>+++>>++[[>>+[>]++>++[<]<-]>+[>]<+<+++[<]<+]>>->[>]++++>++[[<++++++++++++++++>-]<+++++++++.<]>.

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

이것은 "표준"에 대한 수정이다 브레인 퍽의 quine 로, .마지막 그 여분의 압정에서 .각 반복.

quine 자체는 Brainfuck 문자를 16 진 숫자의 스택으로 인코딩합니다. 특히 16 진 숫자 c-0x2b는 다음과 같이 편리합니다.

+: 0x00
-: 0x02
[: 0x30
]: 0x32
<: 0x11
>: 0x13
,: 0x01
.: 0x03

인코딩은 두 가지 코드 조각을 포함합니다. >++[[>>+[>]++>++[<]<-]>+[>]<+<+++[<]<+]>>->[>]++++>++인코딩 자체의 인코딩을 푸시 [[<++++++++++++++++>-]<+++++++++.<]하고 스택을 걷고 모든 것을 인쇄합니다.


3

더티 , 9 바이트

'"n[!]a!␛

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

'   start and end a string literal
"   push a literal '
n   remove newlines
[!] print the string
a   push the alphabet
!   print the first character
␛   end the program

소스 코드 판독이 허용되는 경우 :

더티 , 8 바이트

Q[!]W33!

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

설명 :

Q   push the source code
[!] print each character
W   clear the now-empty stack
33! print an exclaimation mark

유효 할 수 있습니다 :

더티 , 4 바이트

Q[‼]

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

후행 줄 바꿈으로 소스 코드를 인쇄합니다.
(버그로 인해 많은 공간이 있습니다. 그것들 없이는 동일하게 작동합니다.)

참고 만 기본 문자 세트로 작동하고 UTF8 프론트 엔드를 사용하면하지 않는 것이 - 그래서 당신이 사이에 출력 문자를 교체 할 필요가 TIO에 그것을 시도 []와의 무엇의 인쇄를 위해 UTF8 동등한이며, .


1
4 바이트 버전은 확실히 유효하지 않습니다.
Outgolfer Erik

3

자바 8 162 146 바이트

v->{String s="v->{String s=%c%s%1$c+1;return s.format(s,34,s).replaceAll(%1$c1+$%1$c,%1$c%1$c);}"+1;return s.format(s,34,s).replaceAll("1+$","");}

온라인으로 사용해보십시오.
첫 번째 출력 프로그램을 시도하십시오 . 두 번째 출력 프로그램을 시도하십시오 . 세 번째 출력 프로그램을 시도하십시오 .

설명:

v->{                       // Method with empty unused parameter and String return-type
  String s="v->{String s=%c%s%1$c+1;return s.format(s,34,s).replaceAll(%1$c1+$%1$c,%1$c%1$c);}"
                           //  The unformatted source code
           +1;             //  Plus a random digit (1 in this case)
  return s.format(s,34,s)  //  Create the quine
          .replaceAll("1+$","");}
                           //  Then remove any trailing 1s

part :

  • String s포맷되지 않은 소스 코드가 포함되어 있습니다.
  • %s와 함께이 문자열을 입력하는 데 사용됩니다 s.format(...).
  • %c, %1$c그리고 34이중 따옴표를 포맷하는 데 사용됩니다.
  • s.format(s,34,s) 다 합쳐

도전 과제 :

  • +1 포맷되지 않은 프로그램과 포맷 된 프로그램 모두에 1을 추가합니다.
  • .replaceAll("1+$","");}: 프로그램 바이트 수를 2 개 대신 1 개씩 늘리고 싶기 때문에 반환하기 전에 후행 1을 제거합니다.



2

GolfScript , 9 바이트

{'.~1'}.~

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

CJam , 9 바이트

{"_~1"}_~

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

나는이 솔루션을 모두 같은 대답으로 게시하고 있습니다. 왜냐하면 그들은 서로 사소한 변형 일 뿐이며 정확히 같은 방식으로 작동하기 때문입니다. 둘 다 일반적인 GolfScript quine {'.~'}.~(또는 {"_~"}_~CJam)을 기반으로하는데 , 예를 들어이 이전 답변 에서 자세히 설명 합니다.

유일한 차이점은이 변형이 1출력의 끝에 바이트를 추가한다는 것 입니다. 1s 문자열 (또는 선행 0이없는 다른 정수 리터럴)은 GolfScript와 CJam 모두에서 사소한 퀴즈이므로 위 코드 끝에 이미 존재하는 문자열은 출력으로 그대로 복사됩니다. GolfScript (및 CJam)는 임의의 길이의 정수를 사용하기 때문에 코드를 실행하는 컴퓨터에 메모리를 저장하기에 충분한 메모리가있는 한 임의로 긴 프로그램에서 작동합니다.


2

첨부 , 76 72 61 바이트

Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]]",Repr[x+sp]]

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

x각 반복 후 끝에 공백을 추가하는 표준 quine .

처음 몇 번의 반복 :

Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]]",Repr[x+sp]]

Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]] ",Repr[x+sp]]

Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]]  ",Repr[x+sp]]

기타

첨부, 72 바이트

y:=1Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]

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

이것은 각 반복 후에 y설정 되는 변수 를 가진 표준 형식 quine의 변형입니다.10*y

처음 몇 번의 반복 :

y:=1Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]

y:=10Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]

y:=100Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]

기타



1

하스켈 , 88 바이트

main=putStr$snd(span(<'m')s)++show s;s='#':"main=putStr$snd(span(<'m')s)++show s;s='#':"

온라인으로 사용해보십시오! #데이터 문자열 앞에 추가 하여 증가 합니다.


show단순한 문자열 이상을 사용하고 패턴 일치를 사용하여 비트를 절약 할 수 있습니다 . 온라인으로 사용해보십시오!
Ørjan Johansen

트윗 담아 가기 기본 표준 Haskell quine을 제외하고는 완전히 다른 접근 방식이므로 자유롭게 게시하십시오.
Laikoni

그래, 그렇게 생각하면
Ørjan Johansen 2016

1

Stax , 20 18 바이트

"34s+cTZL"34s+cTZL

실행 및 디버깅

반복 할 때마다 2 번째 인용 부호 앞에 여분의 공간을 생성합니다.

설명

프로그램 "34s+cTZL "34s+cTZL을 사용하여 설명합니다.

"34s+cTZL "34s+cTZL
"34s+cTZL "            String literal
           34s+        Prepend a double quote, Now the string is `"34s+cTZL `
               cT      Copy and trim trailing spaces
                 Z     Put a 0 under the top of stack
                       Stack now (from top to bottom): `["34s+cTZL,0,"34s+cTZL ]`
                  L    Collect all elements on stack, from bottom to top
                       Implicit output, 0 is converted to space.


1

룬 마법 , 6 바이트

"'<S@>

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

이것은 이상했다. 내가해야 할 일은 Jo King이 발견 한~ 원래의 quine 에서 a 를 제거하는 것 입니다.

모든 추가 실행은 다음에 다른 <것을 추가합니다 . 예 :

"'<S@><<<<<<<<<

모두 아무것도하지 않습니다.

관련 챌린지에 대한 이 답변 의 직접 사본 . 그것은 매번 반복 할 때마다 이미 1 바이트 씩 증가했습니다 (이 도전에 대한 강한 주장은 그중 하나이거나 그 반대 임).



0

Wonder , 33 바이트

f\ @(-> ol) ["f\ ";f;";f1";#0];f1

각 반복 후에 1을 추가하는 일반 퀴니의 흥미로운 변형입니다.

진행:

f\ @(-> ol) ["f\ ";f;";f1";#0];f1
f\ @(-> ol) ["f\ ";f;";f1";#0];f11
f\ @(-> ol) ["f\ ";f;";f1";#0];f111
...

설명

f\ @                               #. Sets f to a function that does the following:
    (-> ol) [                      #.   Output each:
             "f\ ";                #.     String for declaration of f
                   f;              #.     Formatted representation of f's function
                     ";f1";        #.     String for call of f
                           #0      #.     Argument passed into f
                             ];f1  #. Call f with 1 as the argument

이 quine의 흥미로운 부분 중 하나는 Wonder가 임의의 수의 정밀도로 작동 할 수 있다는 점입니다.


0

ColdFusion, 277 바이트

<cfset u=Chr(34)><cfset q="<cfset u=Chr(34)><cfset q=%s%s%s><cfoutput>%screateObject(%sjava%s,%sjava.lang.String%s).format(q,[u,q,u,Chr(35),u,u,u,u,Chr(35)])%s</cfoutput>
"><cfoutput>#createObject("java","java.lang.String").format(q,[u,q,u,Chr(35),u,u,u,u,Chr(35)])#</cfoutput>

이것은 ColdFusion 퀴인 을 간단하게 수정하여 호출 될 때마다 줄 바꿈을 추가합니다.

lucee-express-5.2.6.60에서 로컬로 테스트


0

Windows 배치, 38 36 바이트

echo|set/p"=q">q&copy/b/y %0+q %0
::

이 코드는 문자 'q'를 포함하는 "q"라는 파일을 만든 다음 원본 파일에 추가합니다. "::"은 추가 공간이 필요없는 "rem"의 별명입니다.

user3493001 덕분에 2 바이트가 절약되었습니다.



0

T-SQL , 175 바이트

DECLARE @ VARCHAR(MAX)='DECLARE @ VARCHAR(MAX)=*SET @=TRIM(REPLACE(@,0x2a,CHAR(39)+@+CHAR(32)+CHAR(39)))PRINT @'SET @=TRIM(REPLACE(@,0x2a,CHAR(39)+@+CHAR(32)+CHAR(39)))PRINT @

먼저 SQL quine을 작성한 다음 여분의 공간을 추가하도록 수정했습니다 ( 이 답변에서 영감을 얻었습니다 ).



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