Schreiben Sie ein einfaches Programm, das sich bei der Ausführung selbst kopiert.
Ihr Programm sollte eine Art ausführbare Datei unter Windows, Linux usw. sein, eine neue ausführbare Datei generieren, die mit Ihrer ursprünglichen ausführbaren Datei identisch ist, mit zufälligem Namen und beendet wird.
Ihr Programm sollte keinerlei Dateien lesen oder kopieren. Es ist nur das Schreiben von Dateien zum Generieren einer neuen ausführbaren Datei zulässig.
(PS. Es war mir ziemlich peinlich, als ich bei Wikipedia Self-replicating program
zum Computer virus
Artikel weiterleitete ...: / ...)
Die kleinste ausführbare Dateigröße gewinnt. Ihre Antwort kann ein Programmiercode mit dem richtigen Betriebssystem und Compiler, Assemblycode oder HEX-Dump einer ausführbaren Datei sein.
Antworten:
Bash, 236
Länger als unbedingt nötig, aber ich hasse lange Schlangen. Die nachfolgende Newline ist nicht optional.
quelle
Assembly für x86 Linux, 106 Bytes
Dies ist für den Nasm-Assembler. Erstellen Sie die Binärdatei mit der Befehlszeile:
nasm -f bin -o a.out selfrep.asm && chmod +x a.out
Hier ist dieselbe Datei wie ein Hex-Dump:
7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 02 00 03 00 01 00 00 00 4C 00 62 2E 2C 00 00 00 00 00 00 00 00 00 00 00 34 00 20 00 01 00 00 00 00 00 00 00 00 00 62 2E 6F 75 74 00 6A 00 00 00 6A 00 00 00 05 00 00 00 00 10 00 00 B0 05 BB 36 00 62 2E B1 41 66 BA B6 01 CD 80 8D 51 29 93 91 B1 00 B0 04 CD 80 B0 01 CD 80
Wie gewünscht kopiert sich das Programm in eine separate Datei. (Das Programm hätte erheblich kürzer sein können, wenn es nur in stdout schreiben und den Benutzer in eine Datei umleiten lassen hätte.)
Ich habe es vermieden, Borderline-Tricks zu verwenden, um die Größe zu reduzieren. Dies sollte eine vollständig konforme 32-Bit-ELF-Binärdatei sein.
Bearbeitet, um hinzuzufügen : In der obigen Version ist die erstellte Datei nur eine einfache Datei, aber mir fällt ein, dass Sie für ein paar Bytes (und eine winzige Biegung der Regeln) etwas Interessanteres erstellen können. Diese Version ist mit 108 Bytes nur zwei Bytes länger:
Nennen Sie diese Version
asr
für "einen Selbstreplikator":nasm -f bin -o asr asr.asm && chmod +x asr
Hex Dump Version für Nasm-Beeinträchtigte:
7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 02 00 03 00 01 00 00 00 4C 00 01 00 2C 00 00 00 00 00 00 00 00 00 00 00 34 00 20 00 01 00 00 00 00 00 00 00 00 00 01 00 61 73 72 00 6C 00 00 00 6C 00 00 00 07 00 00 00 00 10 00 00 B0 05 BB 38 00 01 00 FE 03 B1 41 66 BA FF 01 CD 80 8D 51 2B 93 91 B1 00 B0 04 CD 80 B0 01 CD 80
Wenn Sie es ausführen, wird eine fast identische Datei mit dem Namen erstellt
bsr
, die jedoch selbst ausführbar ist. Wenn Sie es ausführen, wird eine weitere Binärdatei mit dem Namen erstelltcsr
. Und so weiter.(Beachten Sie, dass nachher nervige Dinge passieren
zsr
. Ich habe überlegt, eine Version zu erstellen, die die Namensänderung kaskadiertatr
und so weiter, aber ich denke, die meisten Leute werden sich vorher gut langweilen, daher ist es wahrscheinlich nicht alle zusätzlichen Bytes wert. )quelle
Hier ist ein Proof-of-Concept (ungolfed), der zeigt, wie die Kompilierungsdienste in .NET verwendet werden können, um den Quellcode im laufenden Betrieb zu kompilieren und eine identische Ausgabe zu generieren. Die erste Kopie ist nicht identisch mit dem Original, aber nachfolgende Kopien aus nachfolgenden Läufen sind genau identisch mit zufälligen Dateinamen:
Demonstrationsausgabe über die Befehlszeile:
quelle
Stapel
Version 1 (30 Bytes)
Ich gewinne! :) :)
quelle
DOS COM-Datei - 50 Bytes
Erstellt eine Datei,
X.COM
inX
der die Ziffer der aktuellen Zeit ersetzt wird. COM-Dateien werden einfach am Offset100h
des Datensegments in den Speicher geladen (CS und DS sind gleich eingestellt), sodass wir diesen Speicher einfach in eine Datei schreiben können.Nasm Quelle
quelle
DOS .COM Datei, 29 Bytes
Das '@' wird zufällig durch einen ungeraden Buchstaben in der ersten Hälfte + Teil des Alphabets (A, C, E, G usw.) ersetzt. Ausgabedateien sind entweder 255 oder 256 Byte. Anfangsregister unter echtem DOS (im Gegensatz zu einem Debugger) sind AX = 0000, CX = 00FF, SI = 0100.
quelle
DOS COM-Datei - 36 Bytes
Der Name der Ausgabedatei wird in der Befehlszeile angegeben und auf das 8.3-Format gekürzt. Leerzeichen sind OK (Leerzeichen in DOS-Dateinamen sind zulässig). Getestet mit der WinXP-Eingabeaufforderung.
quelle