Klonen Sie sich!

13

Sie müssen ein Programm erstellen, das unendlich viele Klone von sich selbst erstellt, bis es gestoppt wird. Was auch immer im Originalprogramm ist, muss in den Klonen sein. Mit anderen Worten, die Klone und das ursprüngliche Programm sind in jeder Hinsicht gleich, mit der Ausnahme, dass sich die Klone nicht in demselben Dateityp wie der Quellcode befinden müssen (es können Textdateien sein).

Beispiel:

Wenn mein ursprüngliches Programm ist:

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

Der Klon muss auch sein:

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

Regeln und Erläuterungen:

  • Standardlücken sind verboten

  • Die Klone müssen die exakte Kopie des Originals sein

  • Die Klone müssen lesbare Dateien sein, die ausgeführt werden können, wenn sie in den richtigen Interpreter eingefügt werden

  • Das Programm kann seinen eigenen Quellcode lesen

  • Alle Klone müssen separate Dateien sein

  • Das Ausdrucken Ihres Programms ist nicht gestattet

  • Dateinamen zählen zur Anzahl der Bytes

  • Die Klone müssen sich nicht im selben Verzeichnis wie die Quelldatei befinden und dürfen auch nicht denselben Dateinamen haben

  • Es sollten mindestens 1000 Klone erstellt werden können

Gewinnen:

Die wenigsten Bytes gewinnen!

Anthony Pham
quelle

Antworten:

3

Zsh , 19 17 9 Bytes

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

Per Konsens über Meta wird der Shebang von der Byteanzahl ausgeschlossen.

Probieren Sie es online!

Beachten Sie, dass der Forkbomb-Schutz von TIO den Vorgang abbricht, nachdem 113 Dateien generiert wurden. Ohne diese konservativen Ressourcenbeschränkungen können problemlos 1000 Dateien auf einem System generiert werden.

Dennis
quelle
Ich mag yes `<$0`|split -1viel besser, aber das verdoppelt die Byteanzahl ...
Dennis
Schade , dass die in-out - Umleitung wie das nicht gut funktioniert in Bash :( Einen Moment lang dachte ich naiv outgolfed Sie haben :)
zeppelin
4

Batch, 32 Bytes

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

@Wird nicht verwendet, da STDOUT nicht eingeschränkt ist. %1Der Standardwert ist die leere Zeichenfolge. Sie wird also nzum 1ersten Mal und erhöht sich bei jedem Durchgang. Alternativ könnte dies für 28 Bytes funktionieren, aber ich habe keine Ahnung, wie zufällig es %random%tatsächlich ist, wenn es wie folgt verwendet wird:

copy %0 %random%%random%
%0
Neil
quelle
2
IIRC %random%basiert auf der aktuellen Zeit und kann Werte zwischen 0 und etwas über 32.000 generieren.
user2428118
Zur Verdeutlichung %random%ist eine Variable, die beim Zugriff eine Zufallszahl wie @ user2428118 ergibt, erwähnt.
Conor O'Brien
3

Bash, 25, 16, 1211 Bytes

EDITS:

  • Die neue Zeile (-1 Byte) wurde entfernt und "Online testen" hinzugefügt. Vielen Dank @Dennis!
  • Verwenden Sie die Hintergrundjob-PID $!als Dateinamen (wird alle ~ 32k Dateien wiederverwendet, aber das ist jetzt erlaubt), -4 Bytes

Golf gespielt

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

Erklärt

Erstellt sich vor dem Kopieren als Hintergrundjob mit & neu, sodass jede Iteration unter ihrer eigenen PID ausgeführt wird.

Verwendet die letzte Job-PID als Dateinamen.

Dies kann unbegrenzt (oder bis zum Stoppen) ausgeführt werden, verwendet jedoch ca. 2 Klondateinamen. alle ~ 32k Iterationen.

Es könnte ein bisschen böse sein zu töten, aber AFAIK verstößt nicht gegen die Regeln.

Probieren Sie es online!

Zeppelin
quelle
Haben Sie einen Testplatz, an dem ich das selbst ausprobieren kann?
Anthony Pham
@PythonMaster, ich verwende normalerweise das Online-Testbed von Tutorial Point, aber es hat keine UUID installiert und das Skript macht nicht so viel E / A.
Zeppelin
TIO hat kein Problem mit I / O. Außerdem brauchen Sie den Zeilenvorschub danach nicht mehr &. tio.run/nexus/bash#VY5BS8NAEIXP7q943W5tq6QpelMRRCIIGg/…
Dennis
3

Ruby, 78 Bytes , 77 43 + 4 (Dateiname: a.rb) = 47 Bytes

  • Version 1.2

43 Bytes + Name / Danke an @Alexis So viel kürzer !!!

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

Das ist ungefähr so ​​gut wie ich denke, es wird noch besser

  • Version 1.1

73 Bytes + Name / Danke an @Alexis Anderson

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

74 Bytes + Name

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

Dies ist meine erste Ruby-Antwort, daher sind alle Verbesserungen willkommen.

Roman Gräf
quelle
Kernel öffnen, um die Datei zu öffnen, sollten Sie in der Lage sein, die Datei wegzulassen. insgesamt. w anstelle von "w". Ich finde das do auf der File.open ist nutzlos, da du die geschweiften Klammern hast.
Alexis Andersen
open ('a.rb',? r) anstelle von File.read ('a.rb')
Alexis Andersen
w ist ein Zeichen w. Ein String für sich. ? w == 'w'. Sie brauchen also nicht die Anführungszeichen in "? w"
Alexis Andersen
i = 0 loop do File.write "# {i}", open ("a.rb",? r) i + = 1 end
Alexis Andersen
Eigentlich können Sie auch geschweifte Klammern für die Loop-Methode verwenden
Alexis Andersen
2

sh, 24 Bytes

yes cp $0 '`uuid`'|sh -s
Rainer P.
quelle
2

C #, 104 102 Bytes

-2 Bytes dank Berkeleybross

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

Nein, es ist nicht die kürzeste. Aber es ist C #. Was hast du erwartet?

Hunter Robertson
quelle
1
Sie benötigen keinen Namespace, um den vollständig zu qualifizieren File.Copy. Wechseln Sie in eine for-Schleife, damit Sie die int-Deklaration einfügen und das 1>0Teil entfernen können . Und iFile.Copyclass P{static void Main(){for(int i=0;;)System.IO.File.Copy("c.cs","c"+ ++i+".cs");}}
erhöhen
Eigentlich funktioniert c.csdas nicht, weil es nicht im Ausgabeverzeichnis ist und dort manuell kopiert werden muss. Wie funktioniert das?
TheLethalCoder
Vergessen Sie nicht, String-Interpolation $"c{++i}.cs"ist 2 Bytes kürzer als"c"+ ++i+".cs"
Berkeleybross
1

Verarbeitung, 55 + 5 (Dateiname) = 60 Byte

Ich weiß nicht, ob der Dateiname als zusätzliche Bytes zählt

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

So ziemlich eine Reihe von Buildins, die alle miteinander verkettet sind

Erläuterung

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[]
);
Kritixi Lithos
quelle
Dieser "komplexe Code" lächelt
Roman Gräf
1

ForceLang + das ForceLang-JS-Modul , 162 Byte

set j require njs
j var a=function(){for(;;){var p=new java.io.PrintStream(Math.random()+".txt");p.println("set j require njs");p.print("j var a="+a+";a()")}};a()
SuperJedi224
quelle
1

Python 2, 54 Bytes

from shutil import*
a=__file__
while`copy(a,a*2)`:a*=2
Blau
quelle
Musst du nicht import sys?
Samuel Shifterovich
@SamuelShifterovich hätte ich gehabt. Ich bin nicht sicher, wie diese Bearbeitung überlebt hat, da die von mir verwendete
Blue
1

Mathematica, 41 Bytes

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

Volles Programm. Kopien seiner eigenen Quelldatei in 0, 1, 2etc. im aktuellen Verzeichnis.

LegionMammal978
quelle
1

PHP, 91 60 Bytes

31 Bytes dank manatwork gespart

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

Verwendung: $ php f.phpKlonen f.phpund seinen Code unendlich sich Dateinamen wie Reproduktion 1, 2, 3... bis Timeout.

Vorherige Version:

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

Verbrauch: $ php f.phpKlonen f.phpund deren Code Wiedergabe unendlich selbst mag f1.php,f2.php , f3.php... , f(n).phpbis Timeout.

Mario
quelle
Da der Name der Klondatei beliebig sein kann, sollten Sie nur Zahlen ohne Erweiterung verwenden. <?for(;;)file_put_contents(++$i,file_get_contents("f.php"));
Manatwork
0

awk, 29 (21) Bytes,

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

awk ist nicht wirklich das Werkzeug dafür, da es benötigt wird, close()wenn es auf unbestimmte Zeit läuft. Ansonsten entstehen nur leere Dateien.

Wenn die Anzahl der Klone ein Limit hatte, zum Beispiel 5:

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

Das Programm wäre 21 Bytes.

Fügen Sie das Programm in eine Datei ein aund führen Sie Folgendes aus:

$ awk -f a a
James Brown
quelle
0

Python, 69 Bytes

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

Ich habe versucht, afür den Dateinamen zu verwenden, aber (nicht überraschend) Windows mag keine Dateien mit dem Namen a=open(__file__).read()\ni=0\nwhile 1:i+=1;open(i +'.py','w').write(a). Ich habe es auch versucht:

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

Allerdings gibt es mir diesen Fehler:

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'

Es werden 83 Dateien erstellt, aber das entspricht noch nicht einmal den 1000 benötigten.

Wenn Sie diese Dateien entfernen möchten, können Sie dies verwenden:

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

RBX.Lua, 14 Bytes

IST DIES AUCH EIN DATEISYSTEM, DAS ICH NICHT KENNE

script:Clone()

Klont sich selbst. Wenn es instanziiert wird, wird es erneut ausgeführt, wodurch eine automatische Rekursion bereitgestellt wird.

devRicher
quelle
0

JavaScript ES6 34 Bytes

Nicht sicher, ob das zählt, aber hier:

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

Kuilin Li
quelle
0

Python 2, 61 Bytes (Unix) 65 (plattformübergreifend)

Unix - 61 Bytes

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

Unter Unix cp ist der Befehl systems copy-file -. Wenn ich die Konsole über Popen benutze, kann ich die Datei mit cp kopieren. Neue Dateien erscheinen im Verzeichnis für alte Dateien.

CrossPlatform - 65 Byte

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

Dies funktioniert, da standardmäßig offenes Lesen erlaubt.

Funfact: Ersetzen Sie 1:i+=1mit i:i-=1und es wird bei i Kopien aufhören.

Abgesehen davon sehe ich keine Möglichkeit, es kürzer zu machen als @muddyfish es tat.

Teck-Freak
quelle
0

C 80 Bytes

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

Druckt sich selbst, bis Sie es töten. Nur eine Standard-C-Quine mit einer Endlosschleife.

MD XF
quelle