평균 퀘인 1 배


34

1 장 quine는 quine과 매우 유사 프로그램입니다. 한 가지 큰 차이점은 프로그램의 n 개 사본이 연결될 때 원래 프로그램을 n + 1 번 인쇄하는 것 입니다.

프로그램이 Abc123다음과 같은 경우 :

Abc123  ->  Abc123Abc123
Abc123Abc123  ->  Abc123Abc123Abc123
Abc123Abc123Abc123  -> Abc123Abc123Abc123Abc123

도전

당신의 도전은 모든 언어로 가장 짧은 유효한 1-up quine을 만드는 것입니다. 일반적인 퀴니 규칙이 적용되므로 다음을 수행 할 수 없습니다.

  • 빈 프로그램을 제출하십시오.
  • 직접 또는 간접적으로 1 소스 코드를 읽습니다 .
  • Quining 내장 기능을 사용하십시오.

이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

1 프로그램의 일부로 하드 코드 된 문자열 또는 코드 블록을 사용하는 것은 포함되지 않습니다.


2
n일부 데이터 유형 제한 (최대 정수 크기 등)에 의해 제한 된다면 괜찮 습니까?
Luis Mendo

2
@LuisMendo 합리적인 횟수의 반복 (100, 아마도)을 지원할 수 있다면 괜찮습니다.
ETHproductions

내장 된 quining 방법을 사용하여 소스 코드 의 길이 를 읽을 수 있습니까?
코너 오브라이언

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ 소스 코드에 대한 정보를 아직 얻었으므로 소스 코드 자체를 얻는 것과 조금 비슷합니다. 그래서 안돼.
ETHproductions

답변:


13

GolfScript, 12 바이트

{`'.~'+:n}.~

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

설명

이것은 표준 GolfScript quine의 아이디어를 결합합니다.

{'.~'}.~

그리고 최근에 발견 된 quine :

":n`":n`

주요 아이디어는 n퀴의 추가 사본을 얻기 위해 프로그램의 끝에 암시 적으로 인쇄되는 것을 다시 사용 하는 것입니다. 후속 사본에서 다시 수행 할 때 변수를 지정해도 아무런 변화가 없으므로 사본 하나만 추가됩니다. 코드는 다음과 같습니다.

{        # Standard quine framework. This pushes the block, duplicates it and runs the
         # second copy, such that it can process the first copy to create a quine.
  `      # Convert the block to its string representation.
  '.~'+  # Append the string '.~' to make a complete quine. This is simply left on the
         # stack to be printed at the end.
  :n     # Store the string in n such that one more copy is printed at the end.
}.~

12

GolfScript, 12 바이트

{: ".~"][}.~

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

소스 코드 작동 방식

{: ".~"][}.~

{        }    Define and push a code block.
          .~  Push a copy and execute it.
 :            Save the code block in the space character.
              Every subsequent space will now execute the code block.
   ".~"       Push that string.
       ]      Wrap everything up to the last [ in an array.
        [     Set a new array marker.

위의 소스 코드가 한 번 실행되면 스택은

["" {: ".~"]} ".~"]

여기서 시작시 빈 문자열은 스택의 초기 상태 (빈 입력)에 해당합니다.

소스 코드의 두 복사본은 최종 상태를 유지합니다.

["" {: ".~"]} ".~"] [{: ".~"]} ".~"]

세 사본의 최종 상태

["" {: ".~"]} ".~"] [{: ".~"]} ".~"] [{: ".~"]} ".~"]

등등.

다음에 일어날 일

소스 코드를 실행 한 후 인터프리터는 다음을 수행합니다.

  1. 전체 스택을 배열로 감싸고 해당 배열을 스택에 밀어 넣습니다.

    소스 코드의 두 복사본에 대해 이제 스택에

    ["" {: ".~"][} ".~"] [{: ".~"][} ".~"] [["" {: ".~"][} ".~"] [{: ".~"][} ".~"]]
    
  2. puts랩핑 된 스택을 인쇄하고 라인 피드를 인쇄하기 위해 실행 되었습니다.

    puts로 정의 {print n print}되므로 다음을 수행합니다.

    1. print검사하지 않고 스택의 사본을 인쇄합니다 (즉, 문자열 표현으로 변환하지 않고). 이것은 보낸다

      {: ".~"][}.~{: ".~"][}.~
      

      (소스 코드)를 STDOUT으로 보내고 스택 맨 위에서 스택 사본을 팝합니다.

      이제 스택에

      ["" {: ".~"][} ".~"] [{: ".~"][} ".~"]
      
    2. 이전에 정의한 코드 블록을 실행합니다.

      :[{: ".~"][} ".~"]공백 문자 를 저장 하여 시작한 다음 ".~"자체 를 밀어서 배열을 ]감싸고 새 배열 표시 자를 설정합니다.".~"[

    3. n 단일 줄 바꿈으로 구성된 문자열을 푸시합니다.

      이제 스택에

      ["" {: ".~"][} ".~"] [{: ".~"][} ".~"] [".~"] "\n"
      
    4. 한 번 더 실행됩니다. 그러나 처음 호출했을 때 재정의되었으며 코드 블록이 아닌 배열을 포함합니다.

      실제로 [{: ".~"][} ".~"]스택을

      ["" {: ".~"][} ".~"] [{: ".~"][} ".~"] [".~"] "\n" [{: ".~"][} ".~"]
      
    5. 마지막으로, print검사하지 않고 맨 위 스택 항목을 인쇄하여 전송

      {: ".~"][}.~
      

      STDOUT에 소스 코드를 1 위로 올리십시오.


11

자바 스크립트 ES6 (REPL), 55 바이트

var a=-~a;$=_=>`var a=-~a;$=${$};$();`.repeat(a+1);$();

@ user81655 덕분에 2 바이트가 절약되었습니다!

설명

표준 quine 프레임 워크는 다음과 같습니다.

$=_=>`$=${$};$()`;$()

제출물 내에서이 프레임 워크를 볼 수 있어야합니다. 아래에 더 많은 설명이 있습니다.


var a=-~a;

이 카운터는 기본적으로 1로 설정됩니다. 기본적으로 퀴니를 반복하고 동시에 증가시키는 양을 알려줍니다.

$=_=>`var a=-~a;$=${$};$();`.repeat(a+1);$();

이것은 퀴네 부분입니다. 본질적으로 카운터 +1로 퀴네 문자열을 반복합니다. 후속 함수 호출은 출력을 무시합니다.


이것은 단지 나일 수도 있지만 아무것도 인쇄하지 않는 것 같습니다. (필요한 경우 JSFiddle을 사용하여 테스트 했습니까?)
jrich

아, Firefox 콘솔을 사용해야합니다. (그리고 각 실행 후에 다시로드하여 재설정하십시오 a).
Mama Fun Roll

난 당신이 필요하다고 생각하지 않습니다var
Cyoce

아니요, 처음에는 정의되지 않았기 때문에 수행합니다. var를 사용하면 작업 할 수 있습니다.
Mama Fun Roll

7

CJam, 14 바이트

{"_~"]-2>_o}_~

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

작동 원리

{"_~"]-2>_o}_~

{          }    Define a code block and push it on the stack.
            _~  Push and execute a copy of it.
 "_~"           Push that string.
     ]          Wrap the entire stack in an array.
      -2>       Discard all but the last two elements (block and string).
         _o     Push and print a copy of that array.

프로그램의 마지막 사본이 실행 된 후에는 블록과 문자열을 포함하는 배열이 여전히 스택에 있으므로 암시 적으로 인쇄됩니다.


4

그루비, 83 바이트

s="s=%c%s%c;f={printf(s,34,s,34,10)};f()%cf()//";f={printf(s,34,s,34,10)};f()
f()//

하나의 임베디드 및 후행 줄 바꿈이 없습니다. 인쇄합니다 :

s="s=%c%s%c;f={printf(s,34,s,34,10)};f()%cf()//";f={printf(s,34,s,34,10)};f()
f()//s="s=%c%s%c;f={printf(s,34,s,34,10)};f()%cf()//";f={printf(s,34,s,34,10)};f()
f()//

이 기능 f()은 quine의 사본 하나를 인쇄합니다. 초기 프로그램은 두 번 호출합니다. 추가 된 코드의 첫 번째 줄은 주석이되고 두 번째 호출 만 f()실행됩니다.


4

루비, 43 바이트

1;s="1;s=%p;$><<s%%s*n=2-0";$><<s%s*n=2-0

자체로,이 자체 인쇄 2-0또는 2시간을. 다른 사본 자체에 연결되면 최종 print 문은 다음과 같이 나타납니다 $><<s%s*n=2-01. 즉, 한 번만 출력됩니다 ( 018 진수 1). 따라서 문자열의 최종 사본 만 두 번 인쇄되고 다른 사본은 한 번 인쇄됩니다.

인라인 할당 n은 작업 순서가 올바르게 작동하도록하는 것입니다. 상태는 실제로 한 사본에서 다음 사본으로 전달되지 않습니다.


4

NodeJS, 63 61 60 55 바이트

여러 콘솔 메시지를 줄 바꿈으로 구분하는 경우 (REPL 필요 없음) JavaScript (ES6)에서도 작동합니다.

@ dev-null 덕분에 2 바이트 절약

(f=_=>(t=_=>console.log(`(f=${f})()`)||(_=>t))(t()))()

코드 끝에 줄 바꿈이 있습니다.


이것은 지금까지이 사이트에서 제가 가장 좋아하는 것 중 하나였습니다.

나는 이것이 더 이상 골프를 칠 수 없다고 확신합니다. (아마도 SpiderMonkey의 print기능은 ...)

설명

//FIRST ITERATION
            console.log(`(f=${f})()`)                   //logs to the console a quine of the source code using function f's toString()
                                     ||                 //causes the expression to evaluate to the second part, since console.log's return value is falsy
                                       (_=>t)           //a function that returns function t when called
       t=_=>                                            //defines function t to be the code above. When called, t will log a quine and then return a function that returns t.
      (                                      )(t())     //call t twice. (one call is done via the t() as an ignored parameter) This will print the quine twice.
 f=_=>                                                  //define f as the above code.
(                                                  )()  //call function f with no arguments. this results in a function returning t. (the result of calling t once)
                                                        //this newline is to compensate for console.log's behavior of adding a newline to its output
//SECOND ITERATION
(                                                  )    //call the function that returns t that was returned from the first iteration. This expression will result in whatever that function returns, which is t.
 f=_=>(t=_=>console.log(`(f=${f})()`)||(_=>t))(t())     //this part evaluates to a function, which is passed as a parameter to the function that returns t, that ignores its parameter.
                                                    ()  //call whatever the last expression returned, which is the function t, with no parameters. This will print the quine once.
                                                        //this call will result in a function returning t, just like from the first iteration, so we can add on more iterations at will.

선글라스를 먼저 착용하는 모습도 좋아합니다. (f=_=조금 피곤할 수도 있습니다.
Ben Leggiero

2

루비, 55 바이트

n||=2;s="n||=2;s=%p;$><<(s%%s)*n;n=1;";$><<(s%s)*n;n=1;

여기서 흥미로운 점은 카운터가있는 일반적인 루비 퀘인 일뿐입니다.


2

자바 스크립트 (ES6), 164 바이트

console.log((`+String.fromCharCode(96)).repeat(window.a||(a=3,5)).slice(67,-14))
console.log((`+String.fromCharCode(96)).repeat(window.a||(a=3,5)).slice(67,-14))

두 콘솔 메시지 사이의 간격이 줄 바꿈으로 간주되는 경우 Firefox의 모든 JS 테스트 페이지 또는 콘솔에서 작동합니다.


범용 언어로 이것을하기위한 많은 소품들!
벤 레지에로

단축 windowthis.
Mama Fun Roll



1

와이

비경쟁, 6 바이트

UCn*px

Y는 한동안 가지고 있었던 헤드 캐논이며,이 글을 쓰게 영감을주었습니다. 이와 같은 시퀀싱이 중요한 과제를 해결하기 위해 만들어졌습니다. 코드는 "노드"문자로 링크로 나뉩니다. 이 경우 코드는 노드가 원래 두 개의 체인 (원래)에 배치됩니다 C.

U  C  n* px
1  N    2

U초월 문자열, 즉 링크에 걸쳐있는 문자열을 기록합니다. 그것은 다른 것을 만날 때까지 기록합니다 U. U문자열의 끝에서 a 가 충족되지 않으면 줄 바꿈됩니다. 또한 U기본적으로 문자열에 포함됩니다. 문자열을 기록한 후 node로 C이동하면 다음 링크로 이동합니다.

n체인 수를 푸시합니다. 기본 사례의 경우 2입니다. 일련의 K체인 K+2에는 K노드 가 있으므로 체인이 있습니다 . *문자열 회개입니다. p전체 스택 (이 경우 하나의 문자열)을 인쇄하고 x프로그램을 종료합니다.

텍스트에서 :

UCn*px
U..... record that string
 C     next link
  n*   repeat that string twice.
    px print and terminate

UCn*pxUCn*pxUCn*px
U.....U            record string
 C                 next link
  n*               repeat that string four times (three Cs)
    px             print and terminate

여기 사용해보십시오!


그렇다면 Uquining 외의 실제적인 용도는 무엇입니까? (7k, btw 축하)
ETH 프로덕션

@ETHproductions U를 사용하여 링크에 걸쳐있는 문자열을 캡처하고 링크를 캡처하여 프로그램으로 분해 할 수 있습니다. 그리고 감사합니다! : D
코너 오브라이언

1

Brachylog , 20 바이트

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

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

이 quine 에서 수정되었습니다 .

⊥                       Fail,
 ∨                      or
                w       print
  "⊥∨~kgjw₃w₅"          "⊥∨~kgjw₃w₅"
                 ₃      formatted
              gj        with itself;
                 ₃w₅    print it again at the end of the program if this route succeeds.

이것이 자신과 연결되면 마지막 경로를 제외한 모든 경로가 실패하고 프로그램은 다음 경로로 이동하여 마지막 경로를 제외한 모든 경로를 w₃과거와 뒤로 추적 w₅합니다.

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

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

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

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

⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅⊥∨"⊥∨~kgjw₃w₅"gjw₃w₅

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

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