Clona tu mismo!


13

Debe crear un programa que cree clones exactos de sí mismo infinitamente hasta que se detenga. Lo que esté en el programa original debe estar en los clones. En otras palabras, los clones y el programa original son iguales en todos los sentidos, excepto que los clones no tienen que estar en el mismo tipo de archivo que el código fuente (pueden ser archivos de texto).

Ejemplo:

Si mi programa original es:

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

el clon también debe ser:

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

Reglas y aclaraciones:

  • Las lagunas estándar están prohibidas

  • Los clones deben ser la copia exacta del original.

  • Los clones deben ser archivos legibles que se puedan ejecutar si se colocan dentro del intérprete correcto

  • El programa puede leer su propio código fuente.

  • Todos los clones deben ser archivos separados.

  • No está permitido imprimir su programa

  • Los nombres de archivo cuentan en la cantidad de bytes

  • Los clones no tienen que estar en el mismo directorio que el archivo fuente ni compartir el mismo nombre de archivo

  • Se deben poder crear al menos 1000 clones.

Victorioso:

¡Menos bytes gana!

Respuestas:


3

Zsh , 19 17 9 bytes

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

Por consenso sobre meta , el shebang se excluye del recuento de bytes.

Pruébalo en línea!

Tenga en cuenta que la protección forkbomb de TIO matará el proceso después de que se hayan generado 113 archivos. Puede generar fácilmente 1000 archivos en un sistema sin límites de recursos tan conservadores.


Me gusta yes `<$0`|split -1mucho más, pero eso duplica el recuento de bytes ...
Dennis

Lástima que el cambio de dirección dentro-fuera como eso no funciona bien en la fiesta :( Por un momento, pensé ingenuamente que le han outgolfed :)
Zeppelin

4

Lote, 32 bytes

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

No se usa @porque no hay restricciones en STDOUT. %1el valor predeterminado es la cadena vacía, por lo que se nconvierte en 1la primera vez y se incrementa en cada pasada. Alternativamente, esto podría funcionar para 28 bytes, pero no tengo idea de cuán aleatorio %random%es realmente cuando se usa así:

copy %0 %random%%random%
%0

2
El IIRC %random%se basa en el tiempo actual y puede generar desde 0 hasta algo ligeramente superior a 32,000.
user2428118

Para aclarar, %random%es una variable que, cuando se accede, produce un número aleatorio como @ user2428118 mencionado.
Conor O'Brien

3

Golpetazo, 25, dieciséis, 12, 11 bytes

EDICIONES:

  • Se eliminó la nueva línea (-1 byte), se agregó "Pruébelo en línea". Gracias @ Dennis!
  • Utilice el PID del trabajo en segundo plano $!como nombre de archivo (se reutilizará cada ~ 32k archivos, pero ahora está permitido), -4 bytes

Golfed

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

Explicado

Vuelve a aparecer como un trabajo de fondo con &, antes de hacer una copia, por lo que cada iteración se ejecutará bajo su propio PID.

Utiliza el último PID del trabajo como nombre de archivo.

Esto puede ejecutarse infinitamente (o hasta que se detenga) pero reutilizará los nombres de archivos clonados aprox. cada ~ 32k iteraciones.

Podría ser un poco desagradable matar, pero AFAIK no está en contra de las reglas.

¡Pruébelo en línea!


¿Tiene un lugar de prueba donde puedo probar esto por mí mismo?
Anthony Pham

@PythonMaster, normalmente usaré el banco de pruebas en línea de Tutorial Point, pero no tiene uuid instalado y no le gusta que el script haga tanto IO.
zeppelin

TIO no tiene ningún problema con E / S. Además, no necesita la nueva línea después &. tio.run/nexus/bash#VY5BS8NAEIXP7q943W5tq6QpelMRRCIIGg/…
Dennis

3

Ruby, 78 bytes , 77 43 + 4 (nombre de archivo: a.rb) = 47 bytes

  • Version 1.2

43 bytes + nombre / Gracias a @Alexis ¡Mucho más corto!

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

eso es tan golfizado como creo que va a ser

  • Version 1.1

73 bytes + nombre / Gracias a @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 + nombre

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

Esta es mi primera respuesta de Ruby, por lo que todas las mejoras son bienvenidas.


kernel abierto hacia adelante para abrir archivo, debe poder omitir el archivo. en total. ? w en lugar de "w". Creo que el do en el File.open es inútil, ya que tienes las llaves.
Alexis Andersen

abierto ('a.rb',? r) en lugar de File.read ('a.rb')
Alexis Andersen

? w es un personaje w. Una cadena por derecho propio. ? w == 'w'. así que no necesita las comillas en "? w"
Alexis Andersen

i = 0 loop do File.write "# {i}", open ("a.rb",? r) i + = 1 end
Alexis Andersen

en realidad, también puedes usar llaves para el método de bucle también
Alexis Andersen


2

C #, 104 102 bytes

-2 bytes gracias a berkeleybross

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

No, no es el más corto. Pero es C #. ¿Que esperabas?


1
No necesita un espacio de nombres para poder calificar completamente el File.Copy. Cambiando a un bucle for para que pueda alinear la declaración int y eliminar la 1>0parte. Y pre incremente el ien la File.Copydeclaración, que le da 86 bytes, creo:class P{static void Main(){for(int i=0;;)System.IO.File.Copy("c.cs","c"+ ++i+".cs");}}
TheLethalCoder

En realidad, esto no funcionará porque c.csno estará en el directorio de salida y debe copiarse allí manualmente. ¿Como funciona esto?
TheLethalCoder

¡No se olvide de interpolación de cadenas $"c{++i}.cs"es de 2 bytes más corto que"c"+ ++i+".cs"
berkeleybross

1

Procesando, 55 + 5 (nombre del archivo) = 60 bytes

No sé si el nombre de archivo cuenta como bytes adicionales

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

Casi una serie de builtins encadenados todos juntos

Explicación

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

Ese "código complejo" está sonriendo
Roman Gräf

1

ForceLang + el módulo ForceLang-JS , 162 bytes

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

No ¿Tiene usted que import sys?
Samuel Shifterovich

@SamuelShifterovich habría tenido. No estoy seguro de cómo sobrevivió esa edición, ya que el recuento de bytes que estaba usando era para el programa que ahora se muestra
azul

1

Mathematica, 41 bytes

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

Programa completo Copias de su propio archivo de origen en 0, 1, 2, etc, en el directorio actual.


1

PHP, 91 60 bytes

Guardado 31 bytes gracias a manatwork

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

Uso: $ php f.phpclones f.phpy su código reproducir infinitamente sí en nombres de archivo como 1, 2,3 ... hasta que el tiempo de espera.

Versión previa:

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

Uso: $ php f.phpclones f.phpy su reproducción código infinitamente sí mismo como f1.php, f2.php, f3.php... f(n).phphasta el tiempo de espera.


Como el nombre del archivo de clonación puede ser cualquier cosa, ¿por qué no usar solo números sin extensión? <?for(;;)file_put_contents(++$i,file_get_contents("f.php"));
manatwork

0

awk, 29 (21) bytes,

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

awk no es realmente la herramienta para esto, ya que requiere close()cuando se ejecuta de forma indefinida. De lo contrario, todo lo que produce son archivos vacíos.

Si el recuento de clones tenía un límite, por ejemplo 5:

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

el programa tendría 21 bytes.

Pegue el programa en un archivo ay ejecute:

$ awk -f a a

0

Python, 69 bytes

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

Intenté usar ael nombre del archivo, pero (como era de esperar) a Windows no le gustan los archivos llamados a=open(__file__).read()\ni=0\nwhile 1:i+=1;open(i +'.py','w').write(a). También probé esto:

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

Sin embargo, me da este error:

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'

Crea 83 archivos, pero eso ni siquiera se acerca a los 1000 necesarios.

Si desea eliminar estos archivos, puede usar esto:

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

0

RBX.Lua, 14 bytes

ES ESTO INCLUSO UN SISTEMA DE ARCHIVO QUE NO CONOZCO

script:Clone()

Clones en sí. A medida que se instancia, vuelve a ejecutarse, lo que proporciona una recursión automática.


0

JavaScript ES6 34 bytes

No estoy seguro si esto cuenta, pero aquí:

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


0

Python 2, 61 bytes (unix) 65 (multiplataforma)

Unix - 61 bytes

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

En unix cp está el sistema copy-file - command. Usar la consola a través de popen me permite copiar el archivo por cp. nuevos archivos aparecerán en el directorio de archivos antiguos.

CrossPlatform - 65 bytes

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

Esto funciona, ya que abrir por defecto permite la lectura.

Funfact: reemplazar 1:i+=1con i:i-=1y se detendrá en i copias.

Aparte de eso, no veo forma de hacerlo más corto que @muddyfish.


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);}

Se imprime hasta que lo matas. Solo una quine C estándar con un bucle infinito.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.