自己成長コードcodee codeee codeeee


41

プログラム(または関数)を作成します(P1と呼びましょう)。実行すると、同じ言語で、P1より正確に1バイト長い別のプログラムP2を出力します。

プログラムP2を実行すると、P2より1バイト長い3番目のプログラムP3が出力されます。P3は、P3などよりも1バイト長いプログラムP4を出力する必要があります。P5、P6、...、P∞についても同じです。

プログラムチェーンは無期限に、またはインタープリターがもう処理できない場所に移動する必要があります(ただし、言語では理論的に有効なプログラムのままでなければなりません)

ルール

  • 禁止されている標準的な抜け穴
  • チェーン内のすべてのプログラムは1つの言語である必要があります
  • 入力はありません。出力は標準出力または関数の戻り値になります
  • プログラムは一定期間後に終了する必要があります。特定のタイムスポットの後に出力の生成を停止するプログラムは、終了しない

各言語のバイト単位の最短プログラムP1が勝ちます!


2
@Οurous何??? 私は自分でそのタグを追加しませんでした...
iBug

6
@iBugに関係なく、提出物は独自のソースコードを読むことができますか?
マーティンエンダー

3
@iBug「quine」タグはデフォルトでそれを禁止しており、通常はそうするほうが回答をより興味深いものにします。それはあなた次第です。
マーティンエンダー

1
"puts <<2*2,2\nputs <<2*2,2\n\n2"Rubyの各反復で2ずつ増加します。これ以上良いものは見つかりませんでした。:-/。面白いチャレンジ!
エリックドゥミニル

回答:


28

JavaScript(ES6)、14 12バイト

@Shaggyのおかげで-2バイト

f=_=>"f=_"+f

スニペットのテスト


それを見つけるために少し時間がかかった。こっそり!
シャギー

4
誰かが説明してもらえますか、私はそれを頭に巻き付けることができません、どのように増加しますか?
htmlcoderexe

2
@htmlcoderexe "f=_"_パラメーター名の前に余分な文字を追加します。これにより、反復ごとに長さが長くなります。
ハーマンL

9

7 ASCIIの、4バイト

1603

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

7は通常ASCIIでエンコードされないことを知っていますが、今回は3ビットではなく、実行ごとに1バイトを追加するように、より便利なエンコードです。

これが不正行為としてカウントされるかどうかもわかりません。(多くの方法で境界線をまたいでいるので、7の馬が不正行為を行っているかどうかは不明です。)がを0エンコードするというまともな議論をすることはできます6が、一般に、結果の文字がどこから来るのかは不明です「7には、非常に多くのかなり奇妙な暗黙の動作があるためです。

このプログラムは、自分自身に1アペンドを付けて出力します。これには、いくつかの1sを追加しても出力されます。以下のコメント付きデバッグトレースを示します160311

|| 160311      Initial data ||; initial program 160311
||7 60311      1 command = append 7 to data
|1 0311        6 command = escape from the last | onwards (7 escapes to 1)
|16e77         0311 commands = append 6e77 to data
|16e77 16e77   Implicit (program is empty): copy data past last | to program
|16e777 6e77   1 command = append 7 to data
71603111 e77   6 command = escape from the last | onwards
71603111 e77   e7 command = output in same encoding as the source

|プログラムには残っていないのでe、副作用としてすぐにプログラムを終了し7ます。つまり、最後のsは決して実行されません)。

すべての文字がどこから来ているかについての基本的な混乱は、7のほとんどのコマンドが実行時にデータを生成するだけであり、その後6、特定のデータフラグメントを生成する一連のコマンドを再構築しようとすることです。これは、多くの場合、元のものに近いものの同一ではありません。(クイニングの目的で、通常は結果がほぼ同じになるように7プログラムを記述します。通常、先頭または末尾7のsが異なります。)たとえば、1データ内はになり716、これが追加する最も簡単な方法です。1現在のデータ文字列に。私たちはもともと16、異なる(しかし類似した)文字シーケンスでそれを作成しました。|データが始まるマーカー。(おそらくこれがリテラルのみのクインではないという最良の議論は、出力が入力と異なるということでしょう!)


9

Haskell74 66バイト

編集:

  • を使用してH.PWizで-2バイト<>(10*)<$>

これは、新しく無料の<>演算子を使用するようになりました(Semigroup乗算、インポートなしで動作するにはGHC 8.4が必要です)。

main=putStr$fst<>show$(10*)<$>("main=putStr$fst<>show$(10*)<$>",1)

オンラインでお試しください!(TIOにはまだGHC 8.4がないため、インポートでのチート。)

使い方

  • main=putStr$ 次の文字列値を出力するボイラープレートです。
  • fst<>showは、タプルを受け取り、タプルの文字列表現と連結されたタプルの最初の要素で構成される文字列を返す関数です。すなわち

    (fst<>show)(s,t) = fst(s,t)<>show(s,t) = s++show(s,t)
  • (10*)<$>次のタプルの最後の要素に10を掛け0て、文字列表現に数字を追加します。


1
(<>)
H.PWiz

@ H.PWizありがとう(10*)<$>
Ørjanヨハンセン





4

brainfuck、420バイト

->+++>>+++>+>++>+++>+>+>+++>>>>>>>>>>>>>>>>>>>>+>+>++>+++>++>>+++>+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>+>>+++>>+++>>>>>+++>+>>>>>>>>>++>+++>+++>+>>+++>+++>+>++>>+++>+>+++>+>++>+++>>>+>+>++>+++>+>+>>+++>>>>>>>+>+>>>+>+>++>+++>+++>+>>+++>>>+++>+>++>+++>++>>+>+>++>+++>+>+>>+++>>>>>+++>+>>>>>++>+++>+++>+>>+++>>>+++>+>+++>+>>+++>>+++>>++[[>>+[>]++>++[<]<-]>+[>]<+<+++[<]<+]>>->[>]++++>++[[<++++++++++++++++>-]<+++++++++.<]>.

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

これは、「標準」に変更されBrainFuckのQUINEで、.最後に余分な上の鋲がその.各反復。

クイン自体はBrainfuck文字を16進数字のスタックとしてエンコードします。具体的には、の16進数字はc-0x2b次のように便利です。

+: 0x00
-: 0x02
[: 0x30
]: 0x32
<: 0x11
>: 0x13
,: 0x01
.: 0x03

エンコードは2つのコードスニペットをカバーします。>++[[>>+[>]++>++[<]<-]>+[>]<+<+++[<]<+]>>->[>]++++>++エンコード自体のエンコードをプッシュし[[<++++++++++++++++>-]<+++++++++.<]、スタックをウォークしてすべてを出力します。


3

汚れた、9バイト

'"n[!]a!␛

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

'   start and end a string literal
"   push a literal '
n   remove newlines
[!] print the string
a   push the alphabet
!   print the first character
␛   end the program

ソースコードの読み取りが許可されている場合:

汚れた、8バイト

Q[!]W33!

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

説明:

Q   push the source code
[!] print each character
W   clear the now-empty stack
33! print an exclaimation mark

有効かもしれません:

汚れた、4バイト

Q[‼]

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

ソースコードを末尾の改行で出力します。
(そして、バグのためにたくさんのスペースがあります。ただし、スペースなしでも同じように機能します。)

あなたはそれが間に出力した文字交換する必要があるので、TIO上でそれをしようとする-あなたがUTF8のフロントエンドを使用する場合、それが唯一のネイティブ文字セットで動作し、ないことを注意[]してsのそれは、印刷何のためにUTF8と同等です、 。


1
4バイトバージョンは間違いなく無効です。
エリックアウトゴルファー

3

ジャワ8、162の 146バイト

v->{String s="v->{String s=%c%s%1$c+1;return s.format(s,34,s).replaceAll(%1$c1+$%1$c,%1$c%1$c);}"+1;return s.format(s,34,s).replaceAll("1+$","");}

オンラインでお試しください。
最初の出力プログラムを試してください2番目の出力プログラムを試してください3番目の出力プログラムを試してください

説明:

v->{                       // Method with empty unused parameter and String return-type
  String s="v->{String s=%c%s%1$c+1;return s.format(s,34,s).replaceAll(%1$c1+$%1$c,%1$c%1$c);}"
                           //  The unformatted source code
           +1;             //  Plus a random digit (1 in this case)
  return s.format(s,34,s)  //  Create the quine
          .replaceAll("1+$","");}
                           //  Then remove any trailing 1s

-part:

  • String sは、未フォーマットのソースコードが含まれています。
  • %sを使用して、このStringをそれ自体に入力するために使用されますs.format(...)
  • %c%1$cおよびは34、二重引用符のフォーマットに使用されます。
  • s.format(s,34,s) すべてをまとめる

チャレンジパート:

  • +1 書式なしプログラムと書式付きプログラムの両方に1を追加します。
  • .replaceAll("1+$","");}:プログラムのバイトカウントを2ではなく1だけ増やしたいため、戻る前に末尾の1を削除します。



2

GolfScript、9バイト

{'.~1'}.~

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

CJam、9バイト

{"_~1"}_~

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

私はこれらのソリューションの両方を同じ答えに掲載しています。なぜなら、これらはお互いの些細な違いであり、まったく同じように機能するからです。これらは両方とも、一般的なGolfScript クイン{'.~'}.~(または{"_~"}_~CJam)に基づいています。これについては、たとえば以前の私の回答で詳しく説明しています。

唯一の違いは、このバリアントは1出力の最後にバイトを追加することです。たまたま、1sの文字列(または先行ゼロなしのその他の整数リテラル)はそれ自体、GolfScriptとCJamの両方で些細なものです。したがって、上記のコードの最後にすでに存在するものは、そのまま出力にそのままコピーされます。GolfScript(およびCJam)は任意の長さの整数を使用するため、少なくともコードを実行しているコンピューターにそれを格納するのに十分なメモリがある限り、これは任意の長さのプログラムで機能します。


2

アタッチ76 72 61バイト

Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]]",Repr[x+sp]]

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

x各反復後の末尾にスペースを追加する標準のクイン。

最初の数回の反復:

Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]]",Repr[x+sp]]

Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]] ",Repr[x+sp]]

Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]]  ",Repr[x+sp]]

アタッシュ、72バイト

y:=1Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]

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

これは単純に標準形式のクインのバリエーションであり、変数y10*y各反復後に設定されます

最初の数回の反復:

y:=1Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]

y:=10Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]

y:=100Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]



1

Haskell、88バイト

main=putStr$snd(span(<'m')s)++show s;s='#':"main=putStr$snd(span(<'m')s)++show s;s='#':"

オンラインでお試しください!#データ文字列の先頭に追加することにより成長します。


show文字列だけでなく、パターンマッチングを使用して、少し節約できます。オンラインでお試しください!
Ørjanヨハンセン

@ØrjanJohansenいいね!基礎となる標準Haskellクインを除いて、これはまったく異なるアプローチですので、自由に投稿してください。
ライコニ

そうですね。
Ørjanヨハンセン

1

スタックス20 18バイト

"34s+cTZL"34s+cTZL

実行してデバッグする

反復ごとに2番目の引用符の前に余分なスペースを生成します。

説明

プログラム"34s+cTZL "34s+cTZLを使用して説明します。

"34s+cTZL "34s+cTZL
"34s+cTZL "            String literal
           34s+        Prepend a double quote, Now the string is `"34s+cTZL `
               cT      Copy and trim trailing spaces
                 Z     Put a 0 under the top of stack
                       Stack now (from top to bottom): `["34s+cTZL,0,"34s+cTZL ]`
                  L    Collect all elements on stack, from bottom to top
                       Implicit output, 0 is converted to space.


1

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

"'<S@>

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

これは変だった。私がやらなければならなかったことは、ジョーキングによって見つけられ~た元の馬からa を取り除くことでした。

追加の実行ごと<に、最後に別の実行が追加されます。例:

"'<S@><<<<<<<<<

これらはすべて何もしません。

関連する課題に関するこの回答の直接コピー。繰り返しごとに1バイトずつ既に成長しているのです(このチャレンジがそのチャレンジの複製であること、またはその逆の強い主張)。



0

ワンダー、33バイト

f\ @(-> ol) ["f\ ";f;";f1";#0];f1

各反復後に1を追加する、通常のクインの興味深い変形。

進行:

f\ @(-> ol) ["f\ ";f;";f1";#0];f1
f\ @(-> ol) ["f\ ";f;";f1";#0];f11
f\ @(-> ol) ["f\ ";f;";f1";#0];f111
...

説明

f\ @                               #. Sets f to a function that does the following:
    (-> ol) [                      #.   Output each:
             "f\ ";                #.     String for declaration of f
                   f;              #.     Formatted representation of f's function
                     ";f1";        #.     String for call of f
                           #0      #.     Argument passed into f
                             ];f1  #. Call f with 1 as the argument

このクインの興味深い部分の1つは、Wonderが任意の精度の数で動作できることです。そのため、一定の数の後でも進行は中断しません。


0

ColdFusion、277バイト

<cfset u=Chr(34)><cfset q="<cfset u=Chr(34)><cfset q=%s%s%s><cfoutput>%screateObject(%sjava%s,%sjava.lang.String%s).format(q,[u,q,u,Chr(35),u,u,u,u,Chr(35)])%s</cfoutput>
"><cfoutput>#createObject("java","java.lang.String").format(q,[u,q,u,Chr(35),u,u,u,u,Chr(35)])#</cfoutput>

これは、ColdFusionクインの簡単な修正で呼び出されるたびに改行が追加されます。

lucee-express-5.2.6.60でローカルにテスト済み


0

Windowsバッチ、38 36バイト

echo|set/p"=q">q&copy/b/y %0+q %0
::

このコードは、文字「q」を含む「q」というファイルを作成し、元のファイルに追加します。「::」は追加スペースを必要としない「rem」のエイリアスであることに注意してください。

user3493001のおかげで2バイト節約されました。



0

T-SQL、175バイト

DECLARE @ VARCHAR(MAX)='DECLARE @ VARCHAR(MAX)=*SET @=TRIM(REPLACE(@,0x2a,CHAR(39)+@+CHAR(32)+CHAR(39)))PRINT @'SET @=TRIM(REPLACE(@,0x2a,CHAR(39)+@+CHAR(32)+CHAR(39)))PRINT @

最初にSQLクインを作成し、次にそれを変更して余分なスペースを追加しました(この回答に少し触発されました)。



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