次のソースコードを出力するプログラムを作成します。
- 元のプログラムよりも大きい(文字単位)
- 実行時にそれ自体よりも大きい別のプログラムを印刷します(つまり、新しいプログラムもこの課題に対する有効な回答です)
これはコードゴルフなので、最短の回答が勝ちです。
:^)
次のソースコードを出力するプログラムを作成します。
これはコードゴルフなので、最短の回答が勝ちです。
:^)
回答:
9
そのとおり。一文字。歌詞を出力ビールの99本のボトル有効なプログラムです。無関係なデータはすべてカウントされませんが、そこにはたくさん9
のがあります。
出力されたプログラムの出力は、99本のビールへの歌詞が59回です。
この関数は、プログラムn
時間を実行した場合に歌詞が出力される回数を示します(私の計算が正しい場合):
f(n) = 59n-1
2*59^n-2
、「the」の「h」により「Hello、world!」のインスタンスも含まれることです。
{.'.~'}.~
このコードの出力:
{.'.~'}{.'.~'}.~
どの出力:
{.'.~'}{.'.~'}{.'.~'}.~
どの出力:
{.'.~'}{.'.~'}{.'.~'}{.'.~'}.~
等々。
これは、これまでのところ「本物の」チューリング完全プログラミング言語における最短の答えだと思います。
基本的に、上記の元のコードは「クインレイヤー」です。通常のクインに続いてそれ自体が出力されます。
GolfScriptでは、コードブロックリテラル(例{foo}
:)は、スタック上で邪魔されずに残っている場合、クインです。したがって、{.'.~'}
他のコードブロックと同じように、それ自体で出力するだけです。
.~
コードの最後には、スタック上の最後のコードブロックを取り、それを複製し、コピーを実行します。実行されると、コード.'.~'
ブロック内のコードは、スタックの一番上の項目(つまり、それ自体のコピー)を複製し、stringを追加します.~
。
プログラムの最後で、GolfScriptインタープリターはスタック上のすべてを文字列化し、出力します。この場合、{.'.~'}
入力よりも1つ多くのブロックとstring で構成されます.~
。
]
最初の前に.
(を複製する前にスタック上のすべてのコードブロックを配列に収集するために)を追加すると、指数関数的に成長します。
{].'.~'}.~
出力:
{].'.~'}{].'.~'}.~
どの出力:
{].'.~'}{].'.~'}{].'.~'}{].'.~'}.~
どの出力:
{].'.~'}{].'.~'}{].'.~'}{].'.~'}{].'.~'}{].'.~'}{].'.~'}{].'.~'}.~
等々。
{].'.~'}.~︵ ┻━┻
ファイルとして保存しますBlank.java
。他のファイルとして保存する場合はBlank
、のインスタンスを適切なファイル名に置き換えます。
次に、最初にコンパイルしてからコマンドラインで実行し、次に実行します。コンパイルが失敗した場合、停止します。
Javaのバージョンによって出力が異なる場合があるため、これをJava 7としてリストします。
最初のいくつかの出力(stderrに出力):
Error: Could not find or load main class Blank
Blank.java:1: error: class, interface, or enum expected
Error: Could not find or load main class Blank
^
Blank.java:1: error: reached end of file while parsing
Error: Could not find or load main class Blank
^
2 errors
Blank.java:1: error: class, interface, or enum expected
Blank.java:1: error: class, interface, or enum expected
^
Blank.java:1: error: expected
Blank.java:1: error: class, interface, or enum expected
^
Blank.java:1: error: expected
Blank.java:1: error: class, interface, or enum expected
^
Blank.java:1: error: as of release 5, 'enum' is a keyword, and may not be used as an identifier
Blank.java:1: error: class, interface, or enum expected
^
(use -source 1.4 or lower to use 'enum' as an identifier)
Blank.java:1: error: = expected
Blank.java:1: error: class, interface, or enum expected
^
Blank.java:2: error: expected
Error: Could not find or load main class Blank
^
Blank.java:2: error: ';' expected
Error: Could not find or load main class Blank
^
Blank.java:2: error: = expected
Error: Could not find or load main class Blank
^
Blank.java:2: error: = expected
Error: Could not find or load main class Blank
^
Blank.java:2: error: expected
Error: Could not find or load main class Blank
^
Blank.java:3: error: = expected
^
^
Blank.java:3: error: ';' expected
^
^
Blank.java:4: error: illegal start of type
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: = expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: illegal start of type
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: = expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: illegal start of type
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: = expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: ';' expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: = expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: = expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:4: error: ';' expected
Blank.java:1: error: reached end of file while parsing
^
Blank.java:5: error: expected
Error: Could not find or load main class Blank
^
Blank.java:5: error: ';' expected
Error: Could not find or load main class Blank
^
Blank.java:5: error: = expected
Error: Could not find or load main class Blank
^
Blank.java:5: error: = expected
Error: Could not find or load main class Blank
^
Blank.java:5: error: expected
Error: Could not find or load main class Blank
^
Blank.java:6: error: = expected
^
^
Blank.java:6: error: ';' expected
^
^
Blank.java:7: error: reached end of file while parsing
2 errors
^
30 errors
stdout
)、実際には何も出力されません。
QQ
これは出力です:
QQQQ
2^2^n
、最初のプログラムは世代0ですm -> m^2
。長さは再帰します。
n
では、出力はになりn^n
ます。ただし、それは誤りです。コード長がのn
場合、出力の長さはn^2
puts <<3*3,3
puts <<3*3,3
3
puts
-lineが印刷される回数は指数関数的に増加します。
$ ruby quine.rb | ruby | ruby
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
puts <<3*3,3
3
$ ruby quine.rb | ruby | ruby | ruby | ruby | ruby | ruby | ruby | wc -l
3283
単純なラムダ項
(λu.(u u)(u u))(λu.(u u)(u u))
この用語を1つのベータ削減分だけ減らすと、
((λu.(u u)(u u))(λu.(u u)(u u)))((λu.(u u)(u u))(λu.(u u)(u u)))
などなど。これ(λu.u u)(λu.u u)
は、ラムダ計算のクインであるクラシックの単純なバリアントです。ここでのダブルセルフアプリケーションは、出力が2倍になることを意味します。
これは、有名なImp であるredcodeで書き込み可能な最も簡単な戦士のコードです。
MOV 0, 1
実行されると、コードはメモリ内の次のアドレスに単一の命令のコピーを書き込みます。その後、実行するなど。
print(open(__file__).read())
f=lambda:print('f()')
f()
__ file__を1文字のファイル名に置き換えてファイルを保存することにより、これを短くすることができますが、この答えは質問の精神にあると感じました。1回の反復後、次を出力します。
print(open(__file__).read())
f=lambda:print('f()')
f()
f()
ゴルフ版はほとんど読めないように見えるので、最初に説明します(そして実際の識別子を使用します)。
これは、「スタックオーバーフローを生成する最も奇妙な方法」自己修正メソッドの変形です。
このメソッドは、helloメッセージとその現在のソースを出力します(デモのみ)。次に、コードが修正され、長い文字列が出力され、インストールされます。最後に、新しいコードが再帰的に呼び出されます。
即時の暴走から身を守るために、ユーザーは各サイクルで確認できます。
オブジェクトでコンパイル:
eatMe_alice
|msg mySource|
mySource := thisContext method source.
'**** Hello Alice' printCR.
' ---- my current code is:' printCR.
mySource printCR.
' ---------------' printCR.
(UserConfirmation confirm:'Again? ') ifTrue:[
Object compile:
(mySource
copyReplaceString:'Hello ','Alice'
withString:'Hello ','Alice !').
self eatMe_alice
]
オブジェクトに「eatMe_alice」を送信してショーを開始します。nilは何をしますか:
nil eatMe_alice
優れたバリアントは、新しいコードを再帰的に呼び出すのではなく、呼び出しスタックを展開して新しいメソッドに再入力することにより、繰り返しコードを呼び出すことです。これには、再帰例外が発生しないという利点があります。これを行うには、再帰呼び出し( "self eatMe_alice")を次のように置き換えます。
thisContext resend
ゴルフ:
明らかに、印刷と自己呼び出しは要求されなかったので、最も短い(ゴルフの)方法は、単に自分のソースにコメントを追加して返すことです。副作用として、次の呼び出しにもインストールされます...
x|s|Object compile:(s:=thisContext method source,'""').^s
ファイルを保存する
sed p *
独自の空のディレクトリで、実行sh [file]
可能ファイルを使用するか設定してこのディレクトリから実行します。
8文字の古い代替ですが、独自のディレクトリは必要ありません。ファイルを保存する
sed p $0
を使用して実行するsh [file]
か、実行可能ファイルを設定します。
12文字の古い代替:
sed -i- p $0
これは実際にはプログラムファイル自体に出力されますが、出力先は指定されていません。指数関数的に自身を複製します。
ed
、そのmanページを見たくなかった...
'
オープンクォートは、明らかに、オープンクォートエラーを与えます:
|open quote
| '
| ^
|[-1] /home/runner/.code.tio
Jインタープリターの性質により、エラーは STDERRではなくSTDOUTに出力されることに注意してください。
上記をコードとして実行すると、次のように出力されます。
|open quote
| | '
| ^
|[-2] /home/runner/.code.tio
それから
|open quote
| | | '
| ^
|[-2] /home/runner/.code.tio
等々。コードが実行されるたびに、2行目に4バイトが左詰めされ|
、このチャレンジの要件が満たされます。
echo,~'echo,:~(,quote)'''
出力
echo,:~(,quote)'echo,:~(,quote)'
そして、それは別々の行でそれ自身を2回出力します
echo,:~(,quote)'echo,:~(,quote)'
echo,:~(,quote)'echo,:~(,quote)'
それから
echo,:~(,quote)'echo,:~(,quote)'
echo,:~(,quote)'echo,:~(,quote)'
echo,:~(,quote)'echo,:~(,quote)'
echo,:~(,quote)'echo,:~(,quote)'
等々。
最初の出力は、標準J quineの単純なバリアントです。追加されたものは,:~
垂直に連結され、結果の2D配列は同じ文字列の2行として印刷されます。
"'34'coo1o;
これは標準のクインフレームワークですが、1
各反復後に余分なものが出力されます。オンラインでお試しください!
最初のいくつかの出力:
"'34'coo1o;
"'34'coo1o;1
"'34'coo1o;11
"'34'coo1o;111
非競合の言語が課題を後付けします。
"qp"qp
最初の反復はqp
最後に余分なものを追加し、連続する各反復はこの元のプログラムの余分なコピーを最初に追加します。
"'<S@>
これは変だった。私がしなければならなかったのは、ジョー・キングが見つけ~
たオリジナルのクインからa を取り除くことだけでした。。
追加の実行ごと<
に、最後に別の実行が追加されます。例:
"'<S@><<<<<<<<<
これらはすべて何もしません。
<?echo fgets(fopen(__FILE__,'r')).';';
実行ごとにセミコロンが追加されます。
';'
。その後、より長い出力が得られます。
<?=fgets(fopen(__FILE__,'r')).';';
?
;<?echo fgets(fopen(__FILE__,'r'));
ECMAScript 6(38文字)
(f=_=>'(f='+f+')();(f='+f+')();')();
どの出力:
(f=_=>'(f='+f+')();(f='+f+')();')();(f=_=>'(f='+f+')();(f='+f+')();')();
編集
あなたができる(28文字):
(f=_=>'(f='+f+')();'+f())();
しかし、それは無限に再帰し、何も返しません...しかし、これは次のようなことを行うことで解決できます(42文字):
(f=_=>_?'(f='+f+')('+_+');'+f(_-1):'')(3);
出力されるもの:
(f=_=>_?'(f='+f+')('+_+');'+f(_-1):'')(3);(f=_=>_?'(f='+f+')('+_+');'+f(_-1):'')(2);(f=_=>_?'(f='+f+')('+_+');'+f(_-1):'')(1);
+_+ =_=
絵文字の+1
(print `(or ,-))
確かに、それは対話型のみですが、現在のトップレベルのフォームを参照できるのは、おそらく仕様を満たす非自明なプログラムを最小化するための唯一の最良の方法です。
本当に面白いと思うのは、最速の爆発です。たぶん何かのような
(print `(progn ,@(loop repeat (length -) collect -)))
`
と,
?
or
すぎて、:(print -)
x="print(\"x=\$(repr(x))\\n\$x;\"^2)";print("x=$(repr(x))\n$x;"^2)
出力(134文字):
x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);
結果の実行結果(268文字):
x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);
次の結果(536文字):
x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);
次の結果(1072文字):
x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);x="print(\"x=\$(repr(x))\\n\$x;\"^2)"
print("x=$(repr(x))\n$x;"^2);
これがルールに従っていることを願っています。
それはより大きな出力を生成し、出力自体は再びより大きな出力を生成する有効なソースコードです。
Gollyに含まれてEvoloopセルオートマトン、「QUINE様」な方法で自分自身を複製するパターンをサポートしています。具体的には、これらのパターンにはそれぞれ「プログラム」が含まれています。パターンは、最初にプログラムを実行して(娘の「ボディ」を作成する)、それからプログラムを娘にコピーすることによってそれ自体を再現します。
上記は、より有名な「Langton's Loops」セルオートマトンとEvoloopに適用されますが、Evoloopには興味深い違いがあります。これは、各世代で成長するパターンを簡単に作成できることです。
(私の意見では、もっと興味深いのは、Evoloopが単純なセルラーオートマトンであり、自分自身を再現し、非常に生命のように進化するパターンが含まれているという事実です!これを行う唯一の既知のセルラーオートマトンはEvoloopとその子孫であると思います。しかし、Evoloopの欠点は、特定の「最良の」ゲノムが1つあることです。進化は常に最終的にこの1つのゲノムに収束します。
現在、この提出には2つの欠点があります。一つは、セルオートマトンの「出力」が何であるかが明確ではないということです。しかし、私は、自己複製オートマトンは、馬であることに「十分に近い」と思います。それは確かにそれほど興味深いものではありません!他の欠点は、これらのパターンが単に自分自身のコピーを作成するだけではないことです。各元のパターンのコピーは、それ自体の無限のコピーを作成しようとしますが、これらのコピーは最終的に破壊的な方法で相互作用します。ですから、私は精神的にこの挑戦の要件を満たしていると思いますが、手紙ではそうではありません。
さらに苦労せずに、パターンは次のとおりです。
022222220
270170172
212222202
202000212
272000272
212000202
202222212
271041032
022222250
Gollyにコピーして貼り付けることができる形式のパターンを再度示します。
x = 9, y = 9, rule = Evoloop
.7B$BG.AG.AGB$BA5B.B$B.B3.BAB$BGB3.BGB$BAB3.B.B$B.5BAB$BGA.DA.CB$.6BE
!
さて、しかしそれはどのように見えますか?次のようになります。
上記のアニメーションでは、最初のパターンが大きな娘を作成し、それが大きな孫娘を作成し、次に大きなcreates娘を作成し、最後にさらに大きなgreat孫を作成します。孫娘。このパターンを長時間実行した場合、このように永遠に続きます(または、おそらく、それらは最終的に、はるかに高速に再生できる進化した生物によって追い抜かれます;わかりません)。
このコードを任意の.batファイルに配置すると、(無限ループで)実行が継続され、ファイルも大きくなります。
echo echo %0 ^>^> %0 >> %0
%0
スクリプトを呼び出すために使用されるコマンドであり、.BAT
拡張子がない場合があります。を使用%~nx0
して、バッチファイルの完全なファイル名を取得できます。
.bat
実行する必要はありません。ファイル名がの場合、またはのexecute.bat
いずれexecute
かを入力できますexecute.bat
。両方とも機能します。
.bat
(あなたは拡張子なしでコマンドを入力すると、Windowsがしようと実行するための拡張機能をしかし、あなたはそれを実行するときに拡張子をオフに残すことができ.com
、.exe
そして、.bat
そのために)。ファイル名がある場合はhello.bat
、その>> %0
名前のファイル書き込みますhello
オリジナルではない、hello.bat
(そして実行することはできません)。