Escriba un programa simple que se copie solo cuando se ejecute.
Su programa debe ser algún tipo de archivo ejecutable en Windows, Linux, etc., debe generar un nuevo archivo ejecutable, que es idéntico a su archivo ejecutable original, con un nombre aleatorio y se cierra.
Su programa no debe involucrar ningún tipo de lectura o copia de archivos. Solo se permite la escritura de archivos para generar un nuevo archivo ejecutable.
(PD. Estaba bastante avergonzado cuando en Wikipedia, Self-replicating program
redirige al Computer virus
artículo ...: / ...)
El tamaño de archivo ejecutable más pequeño gana. Su respuesta puede ser un código de programación con sistema operativo y compilador adecuados, código de ensamblaje o volcado HEX de un archivo ejecutable.
Respuestas:
Bash, 236
Más de lo estrictamente necesario, pero odio las largas colas. La nueva línea final no es opcional.
fuente
Ensamblado para x86 Linux, 106 bytes
Esto es para el ensamblador nasm. Construya el binario con la línea de comando:
nasm -f bin -o a.out selfrep.asm && chmod +x a.out
Aquí está el mismo archivo que un volcado hexadecimal:
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
Según lo solicitado, el programa se copia en un archivo separado. (El programa podría haber sido significativamente más corto si se le hubiera permitido escribir en stdout y permitir al usuario redirigir a un archivo).
Evité usar cualquier truco límite para reducir el tamaño. Este debería ser un binario ELF de 32 bits totalmente conforme.
Editado para agregar : en la versión anterior, el archivo creado es solo un archivo simple, pero se me ocurre que por un par de bytes (y una pequeña curva de las reglas), puede crear algo un poco más interesante. Esta versión es solo dos bytes más larga, a 108 bytes:
Nombre esta versión
asr
, para "un autorreplicador":nasm -f bin -o asr asr.asm && chmod +x asr
Versión de volcado hexadecimal para personas con problemas nasm:
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
Cuando lo ejecuta, crea un archivo casi idéntico llamado
bsr
, pero uno que es ejecutable. Ejecutarlo creará otro archivo binario llamadocsr
. Y así.(Tenga en cuenta que las cosas molestas comienzan a suceder después
zsr
. Pensé en hacer una versión que cambiara el nombre en cascadaatr
y así sucesivamente, pero creo que la mayoría de la gente se aburrirá mucho antes de eso, por lo que probablemente no valga la pena todos los bytes adicionales. )fuente
Aquí hay una prueba de concepto (sin golf) que muestra cómo los servicios de compilación en .NET podrían usarse para compilar el código fuente sobre la marcha para generar una salida idéntica. La primera copia no es idéntica al original, pero las copias posteriores de ejecuciones posteriores son exactamente idénticas con nombres de archivos aleatorios:
Salida de demostración en línea de comando:
fuente
Lote
Versión 1 (30 bytes)
¡Yo gano! :)
fuente
Archivo COM de DOS: 50 bytes
Crea un archivo
X.COM
dondeX
se reemplaza con los dígitos de la hora actual. Los archivos COM simplemente se cargan en la memoria en el desplazamiento100h
del segmento de datos (CS y DS están configurados para ser los mismos) para que simplemente podamos escribir esta memoria en un archivo.fuente nasm
fuente
Archivo DOS .COM, 29 bytes
La '@' se reemplaza aleatoriamente por una letra impar en la primera mitad + parte del alfabeto (A, C, E, G, etc.). Los archivos de salida son 255 o 256 bytes. Los registros iniciales en DOS real (a diferencia de un depurador) son que AX = 0000, CX = 00FF, SI = 0100.
fuente
Archivo COM DOS - 36 bytes
El nombre del archivo de salida se especifica en la línea de comando, truncado al formato 8.3, espacios OK (los espacios en los nombres de archivo DOS son legales). Probado con el símbolo del sistema WinXP.
fuente