퀴네 골프는 몇 번이나해야합니까?


12

이 문제를 해결하려면 정수 x를 사용하여 소스를 x여러 번 출력 하는 프로그램을 만들어야합니다 .

규칙

  • 이것은 codegolf입니다. 목표는 프로그램이 가장 적은 바이트를 갖도록 골프를 치는 것입니다.

  • 함수를 제출하면 함수 x는 매개 변수로 취해 코드 전체를 x여러 번 리턴하거나 STDOUT에 인쇄해야합니다 . 함수 본문도 비워 둘 수 없습니다

  • 람다를 제출하면 람다를 변수에 할당 할 필요가 없습니다.

  • 표준 허점 제한이 적용됩니다.

  • 빈 프로그램은 금지되어 있습니다

  • 프로그램은 x정수가 0보다 크거나 같은 경우에만 작동해야합니다.

  • 프로그램이 소스 코드의 일부를 직접 읽지 못할 수도 있습니다.


좋은 첫 번째 질문
대머리 Bantha

x0, 또는 우리는이 양의 정수로 제한 할 수 있습니다?
mbomb007

함수의 소스를 읽을 수 있습니까?
Shaggy

@ mbomb007, 규칙을 명확히하기 위해 수정했습니다. x아마도 0 이상의 정수는
Dignissimus – Spammy

@Shaggy, 나는 그것이 표준 허점이라고 생각했다. 마치 그렇지 않은 것처럼 보인다. 프로그램이 소스 코드의 일부를 읽지 못할 수도 있음을 명확히하기 위해 질문을 편집했습니다.
Dignissimus-Spammy

답변:


8

파이썬 2 , 50 바이트

후행 쉼표와 줄 바꿈에 유의하십시오.

s='s=%r;print s%%s*input(),\n';print s%s*input(),

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


@ mbomb007 코드 끝에 줄 바꿈이 있다고 가정합니다. 문제 해결됨.
MD XF

OP는 x가 0이 될 수 있다고 말했는데,이 경우 아무것도 인쇄하지 않아야 하므로이 대답은 잘못되었습니다.
mbomb007

@NickA 아니요, 잘못된 줄 바꿈을 인쇄합니다.
mbomb007

0은 줄 바꿈을 사용하여 테스트 한 것처럼 줄 바꿈을 인쇄하지 않는 것 같습니다 sys.stdout.write("2").
Ørjan Johansen '


4

RProgN 2 , 8 바이트

{`{.*¶}{

RProgN2 루프 퀴인이 특히 효과적입니다!

{     } # A function literal
       {# Without a matching }, this loops back to the second instruction, which essentially runs the function. This is a bug, but it works to make the "Looping Quine".
 `{.    # Append the literal {, stringifying the function.
    *   # Multiply the stringified function by the input.
     ¶  # Terminate the program.

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


4

Mathematica, 40 33 바이트

7 바이트를 절약 한 lanlock4 덕분에!

StringRepeat[ToString[#0], #1] & 

음이 아닌 정수 인수를 취하는 순수 함수. ToString[#0]현재 순수 함수의 정의에 액세스하는 표준 Mathematica 방식입니다. StringRepeat[..., #1]해당 문자열의 사본을 연결 (입력)합니다. 예를 들어

StringRepeat[ToString[#0], #1] & [2]

수율 :

StringRepeat[ToString[#0], #1] & StringRepeat[ToString[#0], #1] & 

사용 예를 게시 할 수 있습니까? , 실행 예를 들어 , StringJoin @@ Table[ToString[#0], #1] & [2]나에게 오류를 제공합니다.
Julian Wolf

정말? 그 정확한 전화는 저에게 효과적입니다. Mathematica 11을 사용하고 있습니다.
Greg Martin

흠, 나는 여전히 10 (v10.0.1.0)을 사용하고 있습니다. 참고로 다음과 같은 오류가 발생합니다.Table::itform: Argument 2 at position 2 does not have the correct form for an iterator.
Julian Wolf

Aha— Mathematica 10.2 이상에서는 Table[x,5]반환 될 {x,x,x,x,x}것이지만 Mathematica 10.1에서는 이러한 오류가 발생합니다 (예상 Table[x,{5}]).
Greg Martin

나는 당신이 바꿀 수 있다고 생각 StringJoin @@ Table과 함께 StringRepeat.
나무가 아님



3

파이썬 2, 70 바이트

이 솔루션은 경우에 작동합니다 x=0. 하나의 후행 줄 바꿈이 있습니다.

s='s=%r;exec"print%%r;"%%(s%%s)*input()';exec"print%r;"%(s%s)*input()

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


Python 2, 60 바이트 (잘못된)

이것은이라고 가정 x>=1하지만 OP는 x0 이 될 수 있음을 분명히했습니다 . 하나의 후행 줄 바꿈이 있습니다.

s='s=%r;print(s%%s*input())[:-1]\n';print(s%s*input())[:-1]

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


2

언더로드 , 12 바이트

(a(:^)*~^):^

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

Underload에는 다른 입력 방법이 없기 때문에 함수 제출. (TIO 링크는 입력으로 주어진 숫자 4를 보여주고 결과 출력을 인쇄하기위한 코드를 추가합니다).

이것은 단지 보편적 인 quine 생성자입니다 (a(:^)*):^플러스 ~^( "사본의 수는 인수와 동일한 수 있도록").



1

젤리 , 10 바이트

“;⁾vṾẋɠ”vṾ

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

작동 원리

“;⁾vṾẋɠ”vṾ  Main link. No arguments.

“;⁾vṾẋɠ”    Set the argument and the return value to the string ';⁾vṾẋɠ'.
         Ṿ  Uneval; yield '“;⁾vṾẋɠ”'.
        v   Eval ';⁾vṾẋɠ' with argument '“;⁾vṾẋɠ”'.
  ⁾vṾ           Yield 'vṾ'.
 ;              Concatenate '“;⁾vṾẋɠ”' and 'vṾ', yielding the source code.
      ɠ         Read an integer from STDIN.
     ẋ          Repeat the source code that many times.

4
맛있어 보이지만 엄마는 항상 이상한 표정을 입에 넣지 말라고하셨습니다.
Mateen Ulhaq

1

GNU Make , 49 바이트

$(foreach ,$(shell seq $1),$(strip $(value $0))) 

Make는 단일 공백으로 사본을 결합하므로 마지막에 추가 공백 문자를 포함 strip시키고 요구 사항을 충실히 따르려면 사이에 공백 문자를 제거해야합니다 .


기본적으로 명시 적으로 금지 된 소스 코드를 읽는 것처럼 보입니다.
Ørjan Johansen 님

@ ØrjanJohansen 아니요, 소스를 읽지 않고 변수 값을 읽습니다. 다른 답변과 정확히 동일한 원칙입니다 (예 : JS 또는 Python).
eush77

@ ØrjanJohansen 아, 알겠습니다. $0Make 함수에서 쉘과는 다릅니다. 함수가 호출되는 변수의 이름입니다. 참조 gnu.org/savannah-checkouts/gnu/make/manual/html_node/...
eush77

그런 회색 영역을 한숨 . BTW, 파이썬 사람들 은 이것을 하지 않습니다 .
Ørjan Johansen 1

@ ØrjanJohansen 나는이 답변이 Python보다 Python에 훨씬 가깝다고 말하고 싶습니다. 모든 call작업은 실제 매개 변수 로 대체 $0되고 있습니다. $1Python과 마찬가지로 간단한 문자열 보간 %입니다.
eush77


1

베타로드 , 203 바이트

명확성을 위해 줄 바꿈이 추가되었습니다.

(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^

나는 Underload 응답이 일반적으로하는 것처럼 스택의 상단이 아닌 STDIN에서 읽어야한다는 제한을 스스로에게주었습니다. 또한 적절한 십진수 입력을 사용하여 대부분의 코드를 구성합니다.

설명:

나는 quine - 래퍼에서 프로그램을 마무리 : (a(:^)*):^. 이는 quine wrapper 내부의 모든 코드가 스택의 맨 아래에 프로그램의 소스 코드를 갖음을 의미합니다.

숫자를 일반적인 교회 숫자로 변환하기 위해 각 숫자를 코드로 바꾸어 10을 곱하고 그 숫자를 추가하는 기술을 사용합니다.

0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*

여기에는 많은 반복이 있으므로, 스택의 맨 위에서 교회 번호를 가져 와서 "숫자 문자열"을 구성하는 데 사용하는 서브 프로그램으로 패키지를 만들어 보자.

:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*

나는 이것을 신속하게 액세스 할 수 있도록 새로운 환경에 넣었습니다.

#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>

이제에 대한 대체 코드를 만들 수 있습니다 R. R스택의 최상위 요소를 사용하여 STDIN의 문자열을 Betaload 코드로 바꾸는 조회 테이블을 구성합니다. 다음과 같이 작동합니다.

()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R

그러나 방금 만든 서브 프로그램을 사용하여 코드 세그먼트를 생성 할 수 있습니다.

(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...

R실행 되면 입력 값을 교회 숫자를 구성하는 일련의 서브 프로그램으로 변환합니다. 이 서브 프로그램이 실행될 때 스택의 다음 요소 (0은 이전에 위치)에 Church 숫자를 작성합니다. 이는 R^스택의 최상위 값이 교회 숫자가 됨을 의미합니다 . 그런 다음 ^스택의 마지막 요소 (프로그램 소스 코드)에 Church 숫자를 적용하여 답을 얻습니다.

재미있는 사실 : 몇 달 동안이 제출에 대한 MD를 받았습니다. 나는 더 이상 찾을 수없는 질문을 오해 한 후에 그것을 유지했다. 휴지통에서 발굴하여 여기에 게시해야했습니다.



1

파이썬 2 , 41 바이트

_="input('_=%r;exec _'%_*input())";exec _

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

사용하여 좀 해키 출력합니까 input대신을 print하기 때문에, print이 때 줄 바꿈을 인쇄 포함하는 이상한 버그가 에 ... 안된다 . EOF 오류와 함께 종료합니다.

설명:

_="input('_=%r;exec _'%_*input())"; # Set _ to a string
exec _                              # Execute that string
input(                        )     # "print"
      '_=%r;exec _'%_               # The source code with _ formatted in
                     *input()       # Actual input many times



0

펄, 48 바이트

print"$_\47"x(2*pop)for'print"$_\47"x(2*pop)for'

\47작은 따옴표 ( ') 의 8 진수 이스케이프입니다 . 큰 따옴표 ( ") 로 해석 되지만 작은 따옴표로 해석 되지는 않습니다.


0

자바 스크립트 ES6, 27 37 바이트

_=>alert(`${f.name}=${f}`.repeat(_))

편집하다

f=표시해야 할 경우 +10 바이트


f=

_=>alert(`${f.name}=${f}`.repeat(_))

f(2);


@Downvoter 왜?
Weedoze

@Kaiido 모르겠어요 .. 유지해야합니까 f=?
Weedoze

코드는 암시 적으로 toString함수를 호출 하여 자체적으로 읽습니다 .
aebabis

@acbabis 호출 f.toString()또는 f동일하지만 기능 이름을 표시하지 않습니다
Weedoze

@acbabis가 의미하는 바는 "프로그램이 소스 코드의 일부를 직접 읽을 수도 없습니다"라는 문제의 마지막 지점을 위반 f한다는 것입니다.
skyline3000

0

CJam , 20 12 바이트

Martin Ender 덕분에 8 바이트 절약

{"_~"+ri*}_~

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

시험

{       e# Begin a block literal:
 "_~"+  e#  Add whatever's on the stack to the beginning of the array ['_', '~'].
 ri*    e#  Repeat the resulting array a number of times equal to the input.
}       e# Close the block. Push it on the stack.
_~      e# Copy it and run it.

0

PHP, 194 바이트

<?php $a="PD9waHAgJGE9IiMiOyRpPSRhcmd2WzFdO3doaWxlKCRpLS0pZWNobyBzdHJfcmVwbGFjZShjaHIoMzUpLCRhLGJhc2U2NF9kZWNvZGUoJGEpKTs=";$i=$argv[1];while($i--)echo str_replace(chr(35),$a,base64_decode($a));

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

b64 quines가 경향이 있기 때문에 전혀 골프가 아닙니다.


0

Go , 257254 바이트

이것은 나를 아프게한다.

package main;import(."fmt";."strings";."strconv";."os");func main(){s:="package main;import(.\"fmt\";.\"strings\";.\"strconv\";.\"os\");func main(){s:=%q;n,_:=Atoi(Args[1]);Print(Repeat(Sprintf(s,s),n))}";n,_:=Atoi(Args[1]);Print(Repeat(Sprintf(s,s),n))}

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


0

마이크로 스크립트 II, 22 바이트 :

"v{lqp}sN*h"v{lqp}sN*h

Microscript II, 20 바이트 (그러나 코드 블록의 소스 코드에 액세스 할 때 기술적으로 유효하지 않음) :

{s""+`"~sN*"s`+}~sN*

0

C, 144116 바이트

i;main(a){for(i=getchar()-48;i--;)printf(a="i;main(a){for(i=getchar()-48;i--;)printf(a=%c%s%c,34,a,34);}",34,a,34);}

0

파이썬 3, 69 바이트

s='s=%r\nx=int(input())\nprint(s%%s*x)\n'
x=int(input())
print(s%s*x)


0

05AB1E , 17 바이트

0"D34çý×?"D34çý×?

을 추가 하여 기본 수정 .0"D34çý"D34çý×?

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

설명:

0                   # Push 0 to the stack
                    #  STACK: [0]
 "D34çý×?"          # Push the string 'D34çý×?' to the stack
                    #  STACK: [0, 'D34çý×?']
          D         # Duplicate this string
                    #  STACK: [0, 'D34çý×?', 'D34çý×?']
           34ç      # Push '"' to the stack
                    #  STACK: [0, 'D34çý×?', 'D34çý×?', '"']
              ý     # Join the stack by this '"' delimiter
                    #  STACK: ['0"D34çý×?"D34çý×?']
               ×    # Repeat the string the (implicit) input amount of times
                    #  input = 2 → STACK: ['0"D34çý×?"D34çý×?0"D34çý×?"D34çý×?']
                ?   # Output to STDOUT without trailing newline
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.