自分をクローンしてください!


13

停止するまで、それ自体の正確なクローンを無限に作成するプログラムを作成します。元のプログラムにあるものはすべてクローンにある必要があります。言い換えれば、クローンと元のプログラムは、クローンがソースコードと同じ種類のファイルにある必要がないことを除いて、あらゆる点で同じです(テキストファイルでもかまいません)。

例:

私の元のプログラムが次の場合:

for i in range(0, 10):
     print i

クローンも以下でなければなりません:

for i in range(0, 10):
     print i

規則と説明:

  • 標準的な抜け穴は禁止されています

  • クローンはオリジナルの正確なコピーでなければなりません

  • クローンは、適切なインタープリター内に配置された場合に実行できる読み取り可能なファイルでなければなりません

  • プログラムは独自のソースコードを読むことができます

  • すべてのクローンは個別のファイルである必要があります

  • プログラムの印刷は許可されていません

  • ファイル名はバイト数にカウントされます

  • クローンはソースファイルと同じディレクトリにある必要も、同じファイル名を共有する必要もない

  • 少なくとも1000個のクローンを作成できる必要があります

受賞:

最小バイトが勝ちます!

回答:


3

Zsh19 17 9バイト

#!/bin/zsh
<$0>$$;$0

metaのコンセンサスごとに、シバンはバイトカウントから除外されます。

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

TIOのフォークボム保護は、113個のファイルが生成された後にプロセスを強制終了することに注意してください。このような控えめなリソース制限なしに、システム上で1000個のファイルを簡単に生成できます。


私のようなyes `<$0`|split -1多くの方が、それは、バイト数...倍増
デニス

そのような 入出力リダイレクトがbashではうまく機能しないのは残念です:(一瞬、私はあなたを追い抜いたと単純に考えました:)
zeppelin

4

バッチ、32バイト

set/an=%1+1
copy %0 %n%
%0 %n%

@STDOUTに制限がないため、使用していません。%1デフォルトは空の文字列であるため、最初にnなり1、パスごとに増分します。あるいは、これは28バイトで動作する可能性がありますが、次の%random%ように使用した場合、実際にどの程度ランダムであるかわかりません。

copy %0 %random%%random%
%0

2
IIRC %random%は現在の時刻に基づいており、0から32,000をわずかに超えるものまで生成できます。
user2428118 16

明確にするために、%random%@ user2428118に記載されているように、アクセス時に乱数を生成する変数です。
コナーオブライエン

3

バッシュ、 251612、11バイト

編集:

  • 改行(-1バイト)を削除し、「Try It Online」を追加しました。ありがとう@Dennis!
  • バックグラウンドジョブPID $!をファイル名として使用(〜32kファイルごとに再利用されますが、現在は許可されています)、-4バイト

ゴルフ

#!/bin/bash
$0&cp $0 $!

説明した

コピーを実行する前に、&を使用してバックグラウンドジョブとして自身を再生成するため、各反復は独自のPIDの下で実行されます。

ファイル名として最後のジョブPIDを使用します。

これは無限に(または停止するまで)実行できますが、クローンファイル名を約再利用します。〜32k反復ごと。

殺すのは少し厄介かもしれませんが、知る限りではルールに反していません。

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


これを自分で試すことができるテスト場所はありますか?
アンソニーファム

@PythonMaster、私は通常、チュートリアルポイントのオンラインテストベッドを使用しますが、uuidがインストールされておらず、スクリプトがそれほど多くのIOを実行することを好みません。
ツェッペリン

TIOにはI / Oに問題はありません。また、の後の改行は必要ありません&tio.run/nexus/bash#VY5BS8NAEIXP7q943W5tq6QpelMRRCIIGg/...
デニス・

3

Ruby、78バイト77 43 + 4(ファイル名:a.rb)= 47バイト

  • バージョン1.2

43バイト+名前/ @Alexisのおかげで、ずっと短くなりました!!!

loop{File.write "#{$.+=1}",open("a.rb",?r)}

それは私がそれが得るつもりだと思うのと同じくらいゴルフです

  • バージョン1.1

73バイト+名前/ @Alexis Andersonに感謝

i=0
loop do
File.open("#{i}",?w){|b|b.puts File.read("a.rb",?r)}
i+=1
end
  • バージョン1.0

74バイト+名前

i=0
loop do
File.open("#{i}","w") do{|b|b.puts File.read("a.rb")}
i+=1
end

これが私の最初のRubyの回答なので、すべての改善を歓迎します。


カーネルがファイルを開くために前方に開く場合、ファイルを省略することができるはずです。完全に。「w」の代わりに?w 中括弧があるので、File.openのdoは役に立たないと思います。
アレクシスアンデルセン

File.read( 'a.rb')の代わりにopen( 'a.rb'、?r)
Alexis Andersen

?wは文字wです。その中の文字列はそれ自身の権利です。?w == 'w'。「?w」の引用符は必要ありません
アレクシスアンデルセン

i = 0ループdo File.write "#{i}"、open( "a.rb"、?r)i + = 1 end
アレクシスアンデルセン

実際には、ループ方法にも中括弧を使用することもできます
アレクシスアンデルセン


2

C#、104 102バイト

-バークレーブロスのおかげで2バイト

namespace System.IO{class a{static void Main(){int i=0;while(1>0){i++;File.Copy("c{i}.cs");}}}}

いいえ、最短ではありません。しかし、それはC#です。何を期待していましたか?


1
名前空間は必要ないので、を完全に修飾できますFile.Copy。forループに変更して、int宣言をインライン化し、1>0パーツを削除できるようにします。そして、インクリメント事前iFile.Copyあなたに86のバイトを与える声明、私は信じている:class P{static void Main(){for(int i=0;;)System.IO.File.Copy("c.cs","c"+ ++i+".cs");}}
TheLethalCoder

実際c.csには、出力ディレクトリにはなく、そこに手動でコピーする必要があるため、これは機能しません。これはどのように作動しますか?
TheLethalCoder

いけない文字列の補間を忘れること$"c{++i}.cs"よりも2バイト短いです"c"+ ++i+".cs"
berkeleybross

1

処理中、55 + 5(ファイル名)= 60バイト

ファイル名が余分なバイトとしてカウントされるかどうかわかりません

for(int i=0;;)saveStrings(i+++"",loadStrings("a.pde"));

ほとんどすべてのビルトインがすべて連鎖している

説明

for(int i=0;;)           //A complex piece of code that cannot be explained in words alone
saveStrings(             //Save param2 (String[]) into file param1 (String)
 i+++"",                 // filename: the int i (and then is incremented)
 loadStrings("a.pde")    // content: load the content of file a.pde as a String[]
);

「複雑なコードは」笑っていること
ローマグラーフ


1

Python 2、54バイト

from shutil import*
a=__file__
while`copy(a,a*2)`:a*=2

する必要はありませんimport sysか?
サミュエルシフターロビッチ16

@SamuelShifterovich私が持っていただろう。私は確信している編集のバイトは、私が使っていたカウントとして生き残っどのようになりまし示すプログラムのためだったじゃない
ブルー

1

Mathematica、41バイト

For[a=0,1>0,$Input~CopyFile~ToString@a++]

完全なプログラム。コピーし、独自のソース・ファイルに012現在のディレクトリにある、など。


1

PHP、91 60バイト

manatworkのおかげで31バイトを節約

<?for(;;)file_put_contents(++$i,file_get_contents("f.php"));

使用法:$ php f.phpクローンf.php、およびそのコードを、タイムアウトするまで12などのファイル名で無限に複製します3

前のバージョン:

<?for($i=0;;$i++)$p=fwrite(fopen("$i.php","w"),fread(fopen($f="f.php","r"),filesize($f)));

使用法:$ php f.phpクローンf.phpとそのコードを、タイムアウトするまで、、...のようf1.phpに無限に複製します。f2.phpf3.phpf(n).php


クローンファイル名は何でも構いませんので、拡張子のない数字だけを使用してみませんか?<?for(;;)file_put_contents(++$i,file_get_contents("f.php"));
マナトワーク16

0

awk、29(21)バイト、

{while(close(i++)||1)print>i}

awkは、close()無期限に実行するときに必要になるため、実際にはこのためのツールではありません。それ以外の場合は、空のファイルのみが生成されます。

クローン数に制限がある場合、たとえば5:

{while(++i<5)print>i}

プログラムは21バイトになります。

プログラムをファイルに貼り付けてa実行します:

$ awk -f a a

0

Python、69バイト

a=open(__file__).read()
i=0
while 1:i+=1;open(`i`+'.py','w').write(a)

aファイル名に使用してみましたが、(当然のことながら)Windowsはa=open(__file__).read()\ni=0\nwhile 1:i+=1;open(i という名前のファイルを好みません+'.py','w').write(a)。私もこれを試しました:

a=open(__file__).read()
i=''
while 1:i+='.py';open(i,'w').write(a)

しかし、それは私にこのエラーを与えます:

Traceback (most recent call last):
  File "C:/Python27/codeGolfCopy.py", line 3, in <module>
    while 1:i+='.py';open(i,'w').write(a)
IOError: [Errno 2] No such file or directory: '.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py.py'

83個のファイルが作成されますが、必要な1000個に近いものではありません。

これらのファイルを削除する場合は、これを使用できます。

import os;i = 1
while 1:os.remove(`i`+'.py');i+=1

0

RBX.Lua、14バイト

これも私が知らないファイルシステムです

script:Clone()

クローン自体。インスタンス化されると、再度実行されるため、自動再帰が提供されます。


0

JavaScript ES6 34バイト

これが重要かどうかはわかりませんが、ここでは:

_=()=>alert("_="+_+";_()")&_();_()


0

Python 2、61バイト(unix)65(クロスプラットフォーム)

Unix - 61バイト

import os;i=1
while os.popen('cp %s %i.py'%(__file__,i)):i+=1

UNIXでは、cpはシステムのcopy-file-コマンドです。popen経由でコンソールを使用すると、cpでファイルをコピーできます。新しいファイルはold-filesディレクトリに生成されます。

CrossPlatform - 65バイト

i=0
while 1:i+=1;open('%i.py'%i,'w').write(open(__file__).read())

これは、デフォルトで開くと読み取りが許可されるため機能します。

Funfact:と置き換え1:i+=1i:i-=1、iコピーで停止します。

それ以外は、@ muddyfishがやったよりも短くする方法はありません。


0

C、80バイト

main(a){while(1)printf(a="main(a){while(1)printf(a=%c%s%c,34,a,34);}",34,a,34);}

あなたがそれを殺すまで自分自身を印刷します。無限ループを備えた標準のCクインです。

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