가장 긴주기의 퀴네


10

아시다시피 quine은 자체 소스 코드를 출력하는 프로그램입니다. 그러나 다른 프로그램을 출력하여 첫 번째 프로그램을 다시 출력하는 프로그램을 작성할 수도 있습니다. 예를 들어 Python 2 프로그램

x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3

실행하면 다음 텍스트가 출력됩니다.

print """x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3"""

파이썬 프로그램으로 실행하면 원래 코드가 다시 출력됩니다. 이것을 반복 반복 이라고합니다 . 원래 코드를 다시 가져 오려면 두 번 실행해야하므로 기간이 2 입니다. 그러나 물론 훨씬 더 높은 기간이 가능합니다.

당신의 도전은 당신이 선택한 언어로, 당신이 할 수있는 한 100 바이트 이하 의 반복 퀴니를 작성하는 것 입니다. (위의 예제는 후행 줄 바꿈을 포함하여 119 바이트 이므로이 사양에 맞지 않습니다.)

다음 규칙 및 설명을 참고하십시오.

  • 일반적인 quine 규칙이 적용됩니다. 즉, 프로그램에서 자체 소스 코드에 직접 액세스 할 수있는 언어 기능을 사용할 수 없습니다.
  • 반복 된 출력은 결국 원래 코드로 정확하게 되돌아 가야하며, 데모 또는이를 증명해야합니다.
  • 주기가 왜 오래 지속되는지에 대한 설명도 포함해야합니다. 이것은 수학적 증거의 수준 일 필요는 없지만, 당신의 언어에 익숙한 누군가에게 설득력이 있어야합니다. (이 규칙은 일부 답변에 매우 많은 숫자가 포함될 것으로 기대하기 때문에 여기에 있습니다.)
  • 적어도 그 길이가 길다는 것을 증명할 수있는 한, 정확한 수를주는 것보다는 "최소 1,000,000 회 반복"과 같은 것을 말하는 것이 좋습니다. 이 경우 점수는 1,000,000입니다. 그렇지 않으면, 당신의 점수는 quine의 기간입니다.
  • 100 바이트 제한은 초기 프로그램에만 적용됩니다. 물론 원래 코드를 출력하려면 출력이 100 바이트로 줄어야합니다.
  • 머신에 무한 RAM과 무한 런타임이 있다고 가정 할 수 있지만, 언어에 무한정 정밀도 데이터 유형 (예 : 정수)이 있다고 가정 할 수는 없습니다. 당신은 할 수 귀하의 파서가 처리 할 수있는 입력의 길이에 제한이 없음을 가정합니다.
  • 가장 높은 점수가 이깁니다.

참고 : Quit Whining 이라는 기존 과제가 있습니다 . 반복과 관련된 Quining시작하십시오 . 그러나 동일한 개념을 기반으로하는 것 외에도 완전히 다른 유형의 과제입니다. 다른 하나는 곧바로 코드 골프이고, 다른 하나는 (의도적으로!) 변장에서 정말 바쁜 비버 문제입니다. 이 질문에 대한 정답을 얻는 데 필요한 기술은 다른 질문에 대답하는 데 필요한 기술과 매우 다를 수 있으며 이는 의도적으로 설계된 것입니다.


1
@LeakyNun 나는 그것이 당신인지 또는 당신의 대답을 삭제 한 모드인지 모르겠지만, 아마도 무엇이 잘못되었는지 설명한다면 이것이 왜 중복이 아닌지 이해할 것입니다. 이 질문은 소스 길이에 100 바이트 제한을 지정하므로 실제로 해당 방법을 사용하여 "원하는만큼 높을 수 없습니다". 이것이이 질문의 요점입니다. 답을 얻으려면 100 자에 맞는 가장 긴 버전을 게시하고 마침표를 말하십시오. 게시 한 내용은 좋은 첫 시도이지만 승자가 될 가능성은 거의 없습니다.
Nathaniel

1
@ 도전 과제는 적은 수의 바이트로 많은 수를 지정하는 것입니다. 그것이 그것이 고안된 전체 원리입니다. 문제는 언어에서 100 바이트로 지정할 수있는 가장 높은 숫자가 3 ^^^ 3입니까, 아니면 더 큰 것입니까? 이것이 바로이 도전에 관한 것입니다. 그것의 핵심입니다. 사람들이하는 것을보고 싶었습니다. 이 구조와 관련이없는 도전에 대한 피상적 인 유사성에 근거하여 폐쇄되도록하는 것은 매우 초조 한 좌절입니다.
Nathaniel

1
@Dave (두 번째 코멘트) 그러나 영리한 사람이라면 전혀 기계 정밀도에 제한을받지 않아도됩니다. 경쟁 답변의 기간이 2 ^ (2 ^ 64)보다 훨씬 길 것으로 예상합니다.
Nathaniel


1
@PeterTaylor는 훨씬 더 가까운 주제이지만 여전히 매우 다른 도전입니다. 숫자를 인쇄하는 것은 많은 시간을하는 것과는 상당히 다릅니다. 물론 닫히지 않는 것을 선호합니다.
Nathaniel

답변:


10

PHP, 기간 2,100,000,000

PHP에서 이것이 가능하다고 누가 생각했을까요?! :-)

이것은 실제로 내 첫 번째 quine이며 99 바이트 길이입니다.

<?$i=1;$i*=21e8>$i;printf($a='<?$i=%d;$i*=21e8>$i;printf($a=%c%s%c,++$i,39,$a,39);',++$i,39,$a,39);

PHP는 2 * 10^8에서 integer로 전환하는 것보다 더 큰 숫자를 지원하지만 double증가가 더 이상 작동하지 않고 (무한 루프로 이어짐) 100 바이트에 맞는 다른 솔루션을 찾지 못했습니다. 아직.

증명은 21 억의 재설정 지점에 도달 할 때까지 각 반복을 계산하기 때문에 상당히 간단합니다.

의견에 의사 코드로 접근법을 게시 한 dave , Bob Twells 에게 크레딧을 보냈습니다.이 블로그 에서 최소한의 PHP quine을 위해 코드를 복사했습니다.

테스트 프로그램 (sloooooow) :

<?php
$o = file_get_contents('quine.php');
for ($i = 0; $i < 22e8; $i++) {
    if ($i%2==0) exec('php q > p'); else exec('php p > q');
    $a = file_get_contents(($i%2==0) ? 'p' : 'q');
    echo "\r" . str_pad($i,6,' ') . ":\t$a";
    if ($a == $o) {
        die;
    }
}

글쎄, 적어도 나는 대답하는 첫 번째 사람입니다.


1
참고 :이 순서는 ~ 10 ^ 9.322219295입니다.
LegionMammal978

8

수학, 기간 E8.5678 # 3 E2.1923 # 4 ~ E6.2695 # 3 # 2

Print[ToString[#0, InputForm], "[", #1 - 1 /. 0 -> "Nest[#!,9,9^9^99!]", "]"] & [Nest[#!,9,9^9^99!]]

점수는 Hyper-E 표기법에 설명되어 있습니다. 반복은 마지막 Nest[#!,9,9^9^99!]Nest[#!,9,9^9^99!]-1, Nest[#!,9,9^9^99!]-2, Nest[#!,9,9^9^99!]-3, ..., 3, 2, 1 의 10 진 확장으로 대체 하고로 돌아갑니다 Nest[#!,9,9^9^99!].


계승이 더 빨리 자라지 않습니까?
Maltysen

1
Mathematica는 모르지만 이것이 퀴니 규칙을 위반하지 않습니까? 자체 소스 코드를 읽습니까? ToString[#0, InputForm]
daniero

그래서 단지 9 !!!! 작동하지 않습니까? idk cuz 나는 지금 나와 함께 나의 수학 rpi를 가지고 있지 않다.
Maltysen

@Maltysen 9의 이중 계승의 이중 계승 또는 (9 !!)를 계산합니다! ≈ 2.116870635 · 10¹²⁰²
LegionMammal978

@daniero 내 생각에, 아이디어는 표준 CJam과 유사합니다 {"_~"}_~, 그래서 나는 그것이 유효한 것 같아요 ...
LegionMammal978

5

R, 임의 기간 2 ^ 19936-0.5

f=function(){
    options(scipen=50)
    body(f)[[4]]<<-sum(runif(623))
    0
    cat("f=")
    print(f)
}

R의 기본 난수 생성기는주기가 2 ^ 19937-1이고 623 개의 연속 치수로 등분 포가 있습니다. 따라서 그 기간의 어딘가 (단 한 번만)는 623- 길이의 0으로 구성된 벡터입니다. 우리가 거기에 도달하면 (그리고 시퀀스의 시작과 정렬 됨) 다음 623 개의 임의 U [0,1] 숫자의 합은 0이되고 원래 프로그램으로 돌아갑니다.

프로그램은 매우 높은 확률로 0이 아닌 상태로 동일한 0이 아닌 상태를 여러 번 통과합니다. 예를 들어, 합계 311.5가 가장 많을 수 있으며 가능한 많은 방법이 있지만 RNG를 사용하면 0의 기간이 311.5의 기간보다 길 수 있습니다.


이 항목을 어떤 점수에 할당할지 확실하지 않습니다 : P
JDL

1
규칙에 따라 : "정확한 수를주는 것보다는"최소 1,000,000 회 반복 "과 같은 말을하는 것이 좋습니다. 그래서 제 생각에는"최소 1 회 반복 "입니다.
YetiCGN

“임의의 임의의 입력을 생성 할 수 있습니다. 답변이 있습니다”와 같은 많은 표준 허점과 달리, 이것은 정확한 답변이 발생해야한다는 매우 확실한 증거이며 매우 우수한 추정치가 제공됩니다. 좋은!
Andreï Kostyrka

1
프로그램이 기본 상태로 한 번 돌아 오면 정확히 2 ^ 19937-1의 비 랜덤 기간을 갖게됩니다.
JDL

이것의 출력은 실제 프로그램과 일치하지 않습니다 (공백이 약간 있습니다). 또한 프로그램 호출 사이에 상태가 유지되지 않으므로 기간이 정확한 숫자가 아니거나 일정하지도 않습니다
Jo King

1

자바 스크립트, 기간 9,007,199,254,700,000

이기는 것은 아니지만이 과제에서 JavaScript로 작업하는 것은 재미있었습니다.

a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),1-1||90071992547e5)

다음주기를 따릅니다.

a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),1-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254700000-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254699999-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254699998-1||90071992547e5)
// etc...
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),3-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),2-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),1-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254700000-1||90071992547e5)
// and so on

참고 : 점수의 ~ 0.08 % 만 제거하면서 18 바이트를 더 짧게 만들 수 있습니다.

a="a=%s;console.log(a,uneval(a),%.0f-1||9e15)";console.log(a,uneval(a),1-1||9e15)

1

C, 기간 2,100,000,000

unsigned long long i;main(a){i=1;i*=21e8>i;printf(a="ungisned long long i;main(a){i=%d;i*=21e8>i;printf(a=%c%s%2$c,++i,34,a);}",++i,34,a);}

PHP 답변을 기반으로합니다 (분명히). 시간이 있으면 설명으로 업데이트합니다.



1

파이썬 2

기간: 9((99↑↑(9((99↑↑(9((99↑↑(9↑↑51))9)1))9)1))9)+1

기간을 늘리는 @Bubbler에게 감사합니다. 99(99↑↑12)+1 지금까지

b=0;s="print'b=%d;s=%r;exec s'%(-~b%eval('9**9'*eval('9**9'*eval('9**9'*9**9**9**9**9))),s)";exec s

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

코드에서 b=0변경 b=1b=2가에 도달 할 때까지 그래서는 b=decimal expansion of the period다음에 다시 재설정b=0


1
9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9보다 훨씬 높습니다 9**9**99**99**99**99**99**99**99**99**99**99**99**99. 즉, 당신은 eval('9**9'*eval('9**9'*eval('9**9'*9**9**9**9**9)))훨씬 더 많은 숫자 와 같은 것을 할 수 있습니다.
버블 러

페 로이드는 무엇을 의미합니까?
SS Anne


1
@ 무 쿤탄 나는 당신이 기간을 의미한다고 생각하지만 확실하지 않습니다. 나는 유혹이 무엇인지 이해합니다.
SS Anne

@SSAnne 죄송합니다. 오타입니다. 지적 해 주셔서 감사합니다
Mukundan

0

Gol> <> , 70 바이트, 기간 3258831966212970649576002061757190564768048794882887081880032749198609595347701010795124333963480628030557396402253957587908523158768684693906037937296397159081361965059081652271361542879694758390175448119260368080895962090832857

정말로 큰 다른 현명한 사람 (3.25E270)

":1=l8:*6+=S&Q~:'~'=Q~~'H#'||lPffXfX=?1:1=Q$~$~|:1)lPffXfX(Q?:|r2ssH##

이것은 실제로 500 바이트 반복기에 넣은 대답의 변경된 버전입니다.

":1=l8:*6+=S&Q~:'~'=Q~~'H#'||//if last is equal to 1 and length is 71, delete the delete char, if the last char is '~', delete and push 'H#', which will later return to 'H##', completing the cycle!
lPffXfX=?1:1=Q$~$~|          //if length is equal to 15^15^15, then start delete process(append ascii one)
:1)lPffXfX(Q?:|              //if the last character is not 1 (the delete checker), and length is less than 15^15^15, duplicate the last value and append
r2ssH##                      //push the " to the front and output the whole thing

잘만되면 나는 점수를 얻었고, 버그가 없습니다. 이 값 을 실제로 계산하는 실제 방법은 없으며 이론적 인 것입니다. 그러나 사람, 그것은 엄청난 수입니다!

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

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