느리게 성장하는 Quine


30

Quine를 만드십시오.

쉬운 것 같아? 음,이 quine은 그 자체에 첫 번째 문자를 더한 다음, 그 자체에 두 번째 문자를 더해 출력해야합니다.

이런 식으로 quine은 여러 세대에 걸쳐 두 개의 사본을 출력해야합니다.

예 : 코드가되게하십시오 x. 실행하면 출력 x + x[:1]됩니다. 결과 프로그램을 실행하면 다음 x + x[:2]과 같이 출력 됩니다.

코드가 있다면 foobar이것을 실행하면 출력 foobarf됩니다. 이것을 실행하면 출력 foobarfo됩니다. 그리고이 패턴에 따라 계속해서 계속됩니다 :

foobar
foobarf
foobarfo
foobarfoo
foobarfoob
foobarfooba
foobarfoobar
foobarfoobarf

귀하의 프로그램은 2 바이트보다 길어야하며 반복 할 때마다 자체 코드의 한 문자 만 추가로 출력해야합니다.


3
필자는 기본적으로 소스 코드를 읽는 것이 금지되어 있기 때문에 대부분의 언어에서이 문제가 불가능하다고 생각합니다.
Ørjan Johansen

12
@ ØrjanJohansen과 Dennis가 나타납니다
Rod

2
@Rod 글쎄, 나는 모든 것을 말하지 않았다. 많은 / 대부분의 언어가 (1) 구문 오류를주지 않는 방식으로 끝에 임의의 코드 조각을 끝에 추가하는 명백한 방법이 없다는 것입니다. 프로그램이 변경을 감지 할 수 있습니다.
Ørjan Johansen '

3
이것은 매우 특이한 quine이므로 일반적인 quine 허점은 여전히 ​​허용되지 않습니까?
Draconis

답변:


15

Zsh ,110 108 100 바이트

a=`<&0`<<''<<<t;b=${a:0:50};printf $b$b${a:0:-50}
a=`<&0`<<''<<<t;b=${a:0:50};printf $b$b${a:0:-50}

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

그래서 가능합니다.

설명

a=`<&0`<<''<<<t;       # Set A to everything following this line, until eof or
                       #   an empty line (which never happens before eof) encountered.
                       # A "t" is appended to prevent automatic trimming of newlines.
b=${a:0:50};           # Set B to the first line.
printf $b$b${a:0:-50}  # Print two copies of B and
                       #   A with 50 trailing characters removed.


11

R, 289 바이트

s<-c("s<-", "i=get0('i',ifnotfound=0)+1;p=paste0(s,substr(get0('p',ifnotfound=s),1,i),collapse='');cat(s[1]);dput(s);cat(paste0(s[2],substr(p,1,i)))#")
i=get0('i',ifnotfound=0)+1;p=paste0(s,substr(get0('p',ifnotfound=s),1,i),collapse='');cat(s[1]);dput(s);cat(paste0(s[2],substr(p,1,i)))#

영감에 대한 이 퀴네에 대한 크레딧 . 이전 quine과 동일한 R 환경 에서 실행되는 경우에만 작동 합니다.


그것은 맞습니다 설명은 ... 내가 288 회 아직 테스트하지 않았습니다 곧 출시 될 것입니다,하지만 난 꽤 확신
주세페

quine이 줄 바꿈 문자를 추가하기 때문에 289 바이트 여야하지만 어쨌든 큰 문제는 해결했습니다!
IQuick 143

아, 당신은 옳고, 줄 cat바꿈을 추가하는 바보 .
주세페

그러나 이것은 완전한 프로그램입니까? 생성 된 코드가 프로그램 전체입니까?
jimmy23013

@ jimmy23013 내가 알 수있는 한,이 답변과 생성 된 코드는 전체 프로그램입니다. mainR에는 이와 같은 필수 구조 가 없거나 전혀 없습니다 . 게다가, 질문은 전체 프로그램을 명시 적으로 요구하지 않으므로 함수 또는 이와 유사한 기능을 수행합니다.
Steadybox

5

Alice , 29 바이트

4P.a+80pa2*&wdt,kd&w74*,.ok@

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

인쇄 할 수없는 문자는 0x18입니다.

설명

일반적인 "Fungeoid quines의 문제점은 전체 소스 코드를 반복하면 추가 코드가 나오고 "문자열이 더 이상 전체 소스 코드를 덮지 않는다는 것입니다. 이것이 기존 답변이 치트 g접근법을 대신 사용하는 이유라고 생각합니다 .

이 답변은 "기반 접근 방식을 사용 하지만 "소스 에 포함하는 대신 런타임에 프로그램에 작성합니다. 그렇게 "하면 프로그램이 얼마나 자주 반복되는지에 관계없이 하나만있을 것 입니다 (프로그램 크기와 관계없이 하나의 특정 좌표에만 쓰므로).

일반적인 아이디어는 스택에서 전체 소스 코드의 표현을 만들지 만 코드의 크기에 의해 결정된 루프의 길이와 함께 첫 29 개의 문자 (예 : 프로그램 길이) 만 순환한다는 것입니다. 따라서 실제로 임의의 문자 (줄 바꿈 제외)를 추가 할 수 @있으며 결과는 항상 소스보다 한 문자 더 긴 코어 프로그램의 주기적 반복입니다.

4P   Push 4! = 24. This is the code point of the unprintable, which we're 
     using as a placeholder for the quote.
.a+  Duplicate it and add 10, to get 34 = '"'.
80p  Write '"' to cell (8,0), i.e. where the first unprintable is.
    Placeholder, becomes " by the time we get here, and pushes the code
     points of the entire program to the stack. However, since we're already
     a good bit into the program, the order will be messed up: the bottom
     of the stack starts at the 24 (the unprintable) followed by all 
     characters after it (including those from extraneous repetitions). Then 
     on top we have the characters that come in front of the `"`. 
     So if the initial program has structure AB, then any valid program has
     the form ABC (where C is a cyclic repetition of the initial program),
     and the stack ends up holding BCA. We don't care about C, except to
     determine how big the program is. So the first thing we need to do is
     bring B to the top, so that we've got the initial program on top of
     the stack:
a2*  Push 10*2 = 20.
&w   Run the following section 21 times, which is the length of B.

  dt,  Pull up the value at the bottom of the stack.

k    End of loop.
d&w  Run the following section D+1 times, where D is the length of ABC.

  74*  Push 28, one less than the number of characters in AB.
  ,    Pull up the 29th stack element, which is the next character to print.
  .o   Print a copy of that character.

k    End of loop.
@    Terminate the program.

훌륭한 솔루션. 나는 설명을 좋아한다.
IQuick 143

4

Perl 5 , 83 바이트 (최종 줄 바꿈 포함)

$_=q($/=$;;$_="\$_=q($_);eval
__END__
".<DATA>;print$_,/(.).{82}\z/s);eval
__END__

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

좋은 팔자 ' __DATA__토큰은 쉽게 주요 프로그램은 다음을 통해 액세스 할 수있는 모든 펄 프로그램에 임의의 문자열을 추가 할 수 있습니다 <DATA>(실제로 사용하여 파일 핸들 __END__대신, 이전 버전과의 호환성을 위해 같은 일을, __DATA__두 개의 추가 바이트를 저장) .

이 프로그램은 자체 소스 코드를 읽지 않고__END__ 토큰 뒤에 소스에 추가 된 추가 입력 데이터 만 읽습니다 . 사실상, __END__토큰과 그 이후의 모든 것은 입력의 끝으로 끝나는 문자열 리터럴과 같은 기능을합니다.

또한 스펙을 정확하게 충족 시키려면이 프로그램이 개행으로 끝나야합니다. 그렇지 않으면 개행은 실제로 두 번째 후에 자동으로 추가 __END__되지만 첫 번째 반복 출력은 코드와 첫 번째 바이트를 더 이상 정확하게 동일하지 않습니다.


2

Befunge-98 , 30 바이트

0>:#;0g:840#;+*#1-#,_$a3*%0g,@

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

공백으로 종료 된 퀴인을 사용하는 Befunge-98을 사용하여 출력 한 문자 수를 계산합니다. 그러나 g명령을 사용합니다 .


첫 번째 줄에서 경쟁이 아닌 / 속임수임을 언급하고 다른 방법으로받을 수있는 다운 보트를 권장하지 않을 수 있습니다.
quintopia

2

PHP, 146 바이트

ob_start(function($s){return($u=substr($s,0,73)).$u.substr($s,0,-72);})?>ob_start(function($s){return($u=substr($s,0,73)).$u.substr($s,0,-72);})?>

-r명령 행을 사용하여 실행해야합니다 .


온라인으로 시도해도 작동하지 않는 것 같습니다 ! , 그것은 단지 평범한 것입니다.
Ørjan Johansen

@ ØrjanJohansen로 실행해야합니다 php -r 'command'.
jimmy23013

가, 작동시킬 수 없습니다. TIO는 -r 인수를 무시하는 것 같습니다.
Ørjan Johansen '


아하. 나는 그때 무언가를 오해했을 것입니다. 이제 언어 설정으로 PHP와 함께 작동하도록 했습니다 .
Ørjan Johansen 2015

2

룬 마법 , 61 바이트

803X4+kw.'.q}͍}͍}͍}͍}͍}͍}͍}͍}͍::l͍5X-:}-$:l͍{-1--@

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

Alice의 답변과 비슷한 접근 방식을 사용합니다. 문자열 "명령을 코드에 반영하여 하나만 있도록합니다. 나머지는 원래 프로그램을 복구하고 필요한 추가 바이트 수와 필요한 덩어리를 인쇄하기위한 많은 문자열 및 스택 조작이 있습니다.

시퀀스는 메모리 내 문자열 표현을 회전시켜 803X4+kw위치 때문에 위치가 아니라 시작 부분이 아닌 시작 부분에 나타나고 "많은 수의 어색한 숫자를 계산하지 않고도이 작업을 처리하는 쉬운 방법이 없습니다 .

원래 프로그램은 61 있지만 바이트문자열 길이가 전용으로 구조 용이 (50),이다 5X예를 들어, 길이 49 프로그램이 쉬울 것 (그리고이 모든 필요한 기능을 포함 후에 패딩 필요하지 않았다 단지 우연의 일치 같은 인코딩하는 50리터럴을 인코딩하는 것보다 하나의 패딩 바이트 49하면서 51로서 부호화된다 5X3+또는 53) 자체의 추가 바이트를 차지를 갖는.

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