Clone você mesmo!

13

Você deve criar um programa que crie clones exatos de si mesmo infinitamente até parar. O que quer que esteja no programa original deve estar nos clones. Em outras palavras, os clones e o programa original são os mesmos em todos os aspectos, exceto pelo fato de que os clones não precisam estar no mesmo tipo de arquivo que o código-fonte (eles podem ser arquivos de texto).

Exemplo:

Se o meu programa original for:

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

o clone também deve ser:

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

Regras e esclarecimentos:

  • Lacunas padrão são proibidas

  • Os clones devem ser a cópia exata do original

  • Os clones devem ser arquivos legíveis que podem ser executados se colocados dentro do intérprete correto

  • O programa pode ler seu próprio código fonte

  • Todos os clones devem ser arquivos separados

  • Não é permitido imprimir seu programa

  • Os nomes dos arquivos são contados no número de bytes

  • Os clones não precisam estar no mesmo diretório que o arquivo de origem nem compartilhar o mesmo nome de arquivo

  • Pelo menos 1000 clones devem poder ser criados

Ganhando:

Menos bytes ganham!

Anthony Pham
fonte

Respostas:

3

Zsh , 19 17 9 bytes

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

Por consenso sobre meta , o shebang é excluído da contagem de bytes.

Experimente online!

Observe que a proteção de forkbomb do TIO interromperá o processo após a geração de 113 arquivos. Ele pode gerar facilmente 1000 arquivos em um sistema sem esses limites conservadores de recursos.

Dennis
fonte
Gosto yes `<$0`|split -1muito melhor, mas que dobra a contagem de bytes ...
Dennis
Pena que o in-out redirecionamento assim não funciona bem na festa :( Por um momento, eu ingenuamente pensado para ter outgolfed você :)
zeppelin
4

Lote, 32 bytes

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

Não está usando @porque não há nenhuma restrição em STDOUT. %1o padrão é a sequência vazia, ntornando 1- se a primeira vez e incrementando a cada passagem. Como alternativa, isso pode funcionar para 28 bytes, mas não tenho idéia de quão aleatório %random%é realmente quando usado assim:

copy %0 %random%%random%
%0
Neil
fonte
2
O IIRC %random%é baseado no horário atual e pode gerar de 0 a algo um pouco acima de 32.000.
user2428118
Esclarecer, %random% é uma variável que, quando acessada, gera um número aleatório como @ user2428118 mencionado.
Conor O'Brien
3

Bater, 25, 16, 12, 11 bytes

EDITAR% S:

  • Removida a nova linha (-1 byte), adicionada "Experimente online". Obrigado @Dennis!
  • Use o PID da tarefa em segundo plano $!como o nome do arquivo (será reutilizado a cada ~ 32k arquivos, mas agora é permitido), -4 bytes

Golfe

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

Explicado

Aparece novamente como um trabalho em segundo plano com &, antes de fazer uma cópia, para que cada iteração seja executada sob seu próprio PID.

Usa o último PID do trabalho como o nome do arquivo.

Isso pode ser executado infinitamente (ou até parar), mas reutilizará os nomes de arquivos dos clones aprox. a cada ~ 32k iterações.

Pode ser um pouco desagradável de matar, mas o AFAIK não é contra as regras.

Experimente Online!

zepelim
fonte
Você tem um local de testes onde eu possa experimentar isso sozinho?
Anthony Pham
@ PythonMaster, normalmente usarei o banco de testes on-line do Tutorial Point, mas ele não possui o uuid instalado e não gosta que o script faça tanto IO.
Zeppelin
O TIO não tem problemas com E / S. Além disso, você não precisa da nova linha depois &. tio.run/nexus/bash#VY5BS8NAEIXP7q943W5tq6QpelMRRCIIGg/…
Dennis
3

Ruby, 78 bytes , 77 43 + 4 (nome do arquivo: a.rb) = 47 bytes

  • Versão 1.2

43 bytes + nome / Graças a @Alexis Muito mais curto !!!

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

isso é tão jogado quanto eu acho que vai ficar

  • Versão 1.1

73 bytes + nome / Agradecimentos aAlexis Anderson

i=0
loop do
File.open("#{i}",?w){|b|b.puts File.read("a.rb",?r)}
i+=1
end
  • Versão 1.0

74 bytes + nome

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

Esta é a minha primeira resposta Ruby, para que todas as melhorias sejam bem-vindas.

Roman Gräf
fonte
kernel aberto para o arquivo aberto, você deve poder omitir o arquivo. completamente. ? w no lugar de "w". Eu acho que o fazer no File.open é inútil, uma vez que você tem o aparelho.
Alexis Andersen
open ('a.rb',? r) no lugar de File.read ('a.rb')
Alexis Andersen
? w é um personagem w. Uma string em si mesma. ? w == 'w'. então você não precisa das aspas em "? w" #
Alexis Andersen
i = 0 loop File.write "# {i}", aberto ("a.rb",? r) i + = 1 final #
Alexis Andersen
na verdade, você também pode usar chaves para o método de loop também
Alexis Andersen
2

sh, 24 bytes

yes cp $0 '`uuid`'|sh -s
Rainer P.
fonte
2

C #, 104 102 bytes

-2 bytes graças a berkeleybross

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

Não, não é o mais curto. Mas é c #. O que você esperava?

Hunter Robertson
fonte
1
Você não precisa de um espaço para nome para poder qualificar completamente o File.Copy. Alterando para um loop for, para que você possa embutir a declaração int e remover a 1>0peça. E pré incrementar o ina File.Copydeclaração, que lhe dá 86 bytes, acredito:class P{static void Main(){for(int i=0;;)System.IO.File.Copy("c.cs","c"+ ++i+".cs");}}
TheLethalCoder 28/16/16
Na verdade, isso não funcionará porque c.csnão estará no diretório de saída e precisará ser copiado manualmente. Como é que isso funciona?
TheLethalCoder
Não se esqueça sobre interpolação de string $"c{++i}.cs"é de 2 bytes menor do que"c"+ ++i+".cs"
berkeleybross
1

Processando, 55 + 5 (nome do arquivo) = 60 bytes

Não sei se o nome do arquivo conta como bytes extras

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

Praticamente uma série de construções todas encadeadas

Explicação

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[]
);
Kritixi Lithos
fonte
Esse "código complexo" está sorrindo
Roman Gräf
1

ForceLang + o 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()
SuperJedi224
fonte
1

Python 2, 54 bytes

from shutil import*
a=__file__
while`copy(a,a*2)`:a*=2
Azul
fonte
Você não precisa import sys?
Samuel Shifterovich
@SamuelShifterovich eu teria. Eu não tenho certeza de como essa edição sobreviveu, pois a contagem de bytes que eu estava usando era para o programa agora mostrado.
Blue
1

Mathematica, 41 bytes

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

Programa completo. Cópias seu próprio em arquivo de origem 0, 1, 2, etc. no diretório atual.

LegionMammal978
fonte
1

PHP, 91 60 bytes

Economizou 31 bytes graças ao manatwork

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

Usage: $ php f.phpclones f.phpe seu código reproduzir infinitamente-se em nomes de arquivos como 1, 2, 3... até o tempo limite.

Versão anterior:

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

Uso: $ php f.phpclones f.phpe sua reprodução código infinitamente próprio gosto f1.php, f2.php, f3.php... f(n).phpaté o tempo limite.

Mario
fonte
Como o nome do arquivo clone pode ser qualquer coisa, por que não usar apenas números sem extensão? <?for(;;)file_put_contents(++$i,file_get_contents("f.php"));
Manatwork
0

awk, 29 (21) bytes,

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

O awk não é realmente a ferramenta para isso, pois requer uma close()execução indefinida. Caso contrário, tudo o que produz são arquivos vazios.

Se a contagem de clones tiver um limite, por exemplo 5:

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

o programa seria 21 bytes.

Cole o programa em um arquivo ae execute:

$ awk -f a a
James Brown
fonte
0

Python, 69 bytes

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

Tentei usar ao nome do arquivo, mas (sem surpresa) o Windows não gosta de arquivos com o nome a=open(__file__).read()\ni=0\nwhile 1:i+=1;open(i +'.py','w').write(a). Eu também tentei isso:

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

No entanto, ele me dá este erro:

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'

Ele cria 83 arquivos, mas isso não chega nem perto dos 1000 necessários.

Se você deseja remover esses arquivos, pode usar o seguinte:

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

RBX.Lua, 14 bytes

ISSO É MESMO UM SISTEMA DE ARQUIVOS QUE EU NÃO SEI

script:Clone()

Clones em si. À medida que é instanciado, é executado novamente, fornecendo, portanto, recursão automática.

devRicher
fonte
0

JavaScript ES6 34 bytes

Não tenho certeza se isso conta, mas aqui:

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

Kuilin Li
fonte
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

No unix cp está o sistema copy-file - command. Usar o console via popen me permite copiar o arquivo por cp. novos arquivos aparecerão no diretório de arquivos antigos.

CrossPlatform - 65 bytes

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

Isso funciona, pois abrir no padrão permite a leitura.

Funfact: substitua 1:i+=1por i:i-=1e ele irá parar em i cópias.

Fora isso, não vejo como torná-lo mais curto do que o @muddyfish fez.

Teck-freak
fonte
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);}

Imprime-se até matá-lo. Apenas um padrão C quine com um loop infinito.

MD XF
fonte