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!

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.


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

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!


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.


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

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?


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[]
);

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()

1

Python 2, 54 Bytes

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

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.


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.


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

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

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.



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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.