成長の遅いクイン


30

クインを作ります。

簡単そうですね。さて、この馬は自分自身とその最初の文字を出力する必要があります。

このようにして、いくつかの世代でクインは2つのコピーを出力します。

例:コードをとしますx。実行すると出力されますx + x[:1]。結果のプログラムを実行するx + x[:2]と、出力などが表示されます...

コードがあった場合、foobarこれを実行すると出力されますfoobarf。これを実行すると出力されますfoobarfo。など、このパターンに従って以下のようになります。

foobar
foobarf
foobarfo
foobarfoo
foobarfoob
foobarfooba
foobarfoobar
foobarfoobarf

プログラムは2バイトより長く、各反復で独自のコードの余分な文字を1つだけ出力する必要があります。


3
ソースコードの読み取りはデフォルトで禁止されているため、ほとんどの言語ではこの課題は不可能だと思われます。
Ørjanヨハンセン

12
@ØrjanJohansen、次にデニスが現れます
ロッド

2
@Rodさて、私はすべてを言いませんでした、それは多くの/ほとんどの言語が(1)構文エラーを与えないように(2)プログラムは変更を検出できます。
Ørjanヨハンセン

3
これは非常に珍しいクインなので、通常のクインの抜け穴はまだ許可されていませんか?
ドラコニス

回答:


15

Zsh110 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)))#

インスピレーションをこの馬に与えた。前のクインが実行されるのと同じ R環境で実行される場合にのみ機能します。


説明は近日中に行われます...私はまだ288回テストしていませんが、それが正しいと確信しています
ジュゼッペ

おそらく、このクインが改行文字を追加するので289バイトであるはずですが、とにかくそれを解決できたのは素晴らしいことです!
IQuick 143

ああ、あなたは正しい、愚かなcat改行を追加します。
ジュゼッペ

しかし、これは完全なプログラムですか?生成されたコードは完全なプログラムですか?
jimmy23013

@ jimmy23013私が知る限り、この答えと生成されたコードは完全なプログラムです。mainRにはそのような必須の構造はないか、他にありません。さらに、質問は完全なプログラムを明示的に要求しないので、関数または同様のものが必要です。
Steadybox

5

アリス、29バイト

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

オンラインでお試しください!

印刷できない文字は0x18です。

説明

通常の"ベースのFungeoid quinesの問題は、ソースコード全体を繰り返す"と、さらに追加され、文字列がソースコード全体をカバーしなくなることです。そのため、既存の回答ではチートgアプローチが使用されています。

この回答では- "ベースのアプローチを使用しています"が、ソースにaを含める代わりに、実行時にプログラムに書き込みます。そう"すれば、プログラムが繰り返される頻度に関係なく1つしか存在しません(プログラムのサイズに関係なく、特定の1つの座標にのみ書き込むためです)。

一般的な考え方は、スタック上にソースコード全体の表現を作成しますが、コードのサイズによって決定されるループの長さで文字の最初の29(プログラムの長さ)だけを循環させることです。したがって、実際に任意の文字(改行を除く)を後に追加することができ@、結果は常にソースより1文字長いコアプログラムの周期的な繰り返しになります。

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__トークンは、それが簡単にメインプログラムは、その後経由でアクセスできる任意のPerlプログラムに任意の文字列を追加することができます<DATA>(実際に使用してファイルハンドルが__END__代わりに、後方互換性のために同じことを行い、__DATA__2つの余分なバイトが保存されます) 。

このプログラムは独自のソースコードを読み取ら__END__トークンの後にソースに追加された追加の入力データのみを読み取ることに注意してください。実際には、__END__トークンとその後のすべては、入力の最後で終了する文字列リテラルのように機能します。

また、仕様を正確に満たすために、このプログラムは改行で終わる必要があることに注意してください。そうでない場合、実際には改行は2番目の後に実際に自動的に追加されます__END__が、最初の反復出力はコードとその最初のバイトに正確に等しくなりません。



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ヨハンセン

@ØrjanJohansenで実行する必要がありphp -r 'command'ます。
jimmy23013

ああ、動作させることができません。TIOは-r引数を無視するようです。
Ørjanヨハンセン


あぁ。私は当時何かを誤解していたに違いありません。今では、PHPを言語設定として使用することもできました。
Ørjanヨハンセン

2

ルーン文字のエンチャント、61バイト

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

オンラインでお試しください!

アリスの答えと同様のアプローチを使用します:文字列"コマンドをコードに反射的に書き込み、1つのみが存在するようにします。残りは、元のプログラムを復元するための文字列とスタックの操作、必要な追加バイト数、および必要なハンクを出力するための操作です。

シーケンスは、周りのようにメモリ内の文字列表現を回転させる803X4+kwの位置による終わりから始まるの代わりに表示され、"厄介な数字の多くを計算しなくても、この操作を処理する簡単な方法がないと。

元のプログラムは61 バイトですが文字列の長さはわずか50です。これは簡単に構築でき、5X必要な機能をすべて含めた後、これをパディングする必要がなかったのは偶然でした(たとえば、長さ49のプログラムは簡単です)としてエンコードする50リテラルを符号化するよりも、パディングの1バイトと49しながら、51として符号化される5X3+、または53)、自身の余分なバイトのアカウントを有します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.