Écrivez un programme simple qui se copie lorsqu'il est exécuté.
Votre programme doit être une sorte de fichier exécutable sous Windows, Linux, etc., doit générer un nouveau fichier exécutable, identique à votre fichier exécutable d'origine, avec un nom aléatoire, et se ferme.
Votre programme ne doit impliquer aucun type de lecture ou de copie de fichiers. Seule l'écriture de fichier pour générer un nouveau fichier exécutable est autorisée.
(PS. J'étais assez gêné quand sur Wikipedia, Self-replicating program
redirige vers l' Computer virus
article ...: / ...)
La plus petite taille de fichier exécutable gagne. Votre réponse peut être un code de programmation avec un système d'exploitation et un compilateur appropriés, un code d'assemblage ou un vidage HEX d'un fichier exécutable.
Réponses:
Bash, 236
Plus long que strictement nécessaire, mais je déteste les longues lignes. La nouvelle ligne de fin n'est pas facultative.
la source
Assemblage pour x86 Linux, 106 octets
C'est pour l'assembleur nasm. Construisez le binaire avec la ligne de commande:
nasm -f bin -o a.out selfrep.asm && chmod +x a.out
Voici le même fichier qu'un vidage hexadécimal:
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
Comme demandé, le programme se copie dans un fichier séparé. (Le programme aurait pu être considérablement plus court s'il avait été autorisé à simplement écrire sur stdout et à laisser l'utilisateur rediriger vers un fichier.)
J'ai évité d'utiliser des astuces limites pour réduire la taille. Il doit s'agir d'un binaire ELF 32 bits entièrement conforme.
Modifié pour ajouter : dans la version ci-dessus, le fichier créé est juste un fichier ordinaire, mais il me semble que pour quelques octets (et un petit pli des règles), vous pouvez créer quelque chose d'un peu plus intéressant. Cette version ne fait que deux octets de plus, à 108 octets:
Nommez cette version
asr
, pour "un auto-réplicateur":nasm -f bin -o asr asr.asm && chmod +x asr
Version de vidage hexadécimal pour les nasm-altérés:
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
Lorsque vous l'exécutez, il crée un fichier presque identique nommé
bsr
, mais qui est lui-même exécutable. L'exécuter créera un autre fichier binaire nommécsr
. Etc.(Notez que des choses ennuyeuses commencent à se produire après
zsr
. J'ai envisagé de créer une version qui répercuterait le changement de nom suratr
et ainsi de suite, mais je pense que la plupart des gens s'ennuieront bien avant cela, donc cela ne vaut probablement pas tous les octets supplémentaires. )la source
Voici une preuve de concept (non golfée) qui montre comment les services de compilation dans .NET peuvent être utilisés pour compiler le code source à la volée pour générer une sortie identique. La première copie n'est pas identique à l'original, mais les copies suivantes des exécutions suivantes sont exactement identiques avec des noms de fichiers aléatoires:
Sortie de démonstration en ligne de commande:
la source
Lot
Version 1 (30 octets)
Je gagne! :)
la source
Fichier DOS COM - 50 octets
Crée un fichier
X.COM
oùX
est remplacé par le chiffre des de l'heure actuelle. Les fichiers COM sont simplement chargés dans la mémoire à l'offset100h
du segment de données (CS et DS sont définis pour être identiques) afin que nous puissions simplement écrire cette mémoire dans un fichier.source de nasm
la source
Fichier DOS .COM, 29 octets
Le '@' est remplacé aléatoirement par une lettre impaire dans la première moitié + partie de l'alphabet (A, C, E, G, etc.). Les fichiers de sortie font 255 ou 256 octets. Les registres initiaux sous DOS réel (par opposition à un débogueur) sont que AX = 0000, CX = 00FF, SI = 0100.
la source
Fichier DOS COM - 36 octets
Le nom du fichier de sortie est spécifié sur la ligne de commande, tronqué au format 8.3, les espaces sont OK (les espaces dans les noms de fichiers DOS sont légaux). Testé à l'aide de l'invite de commande WinXP.
la source