Escreva um programa simples que se copie quando executado.
Seu programa deve ser algum tipo de arquivo executável no Windows, Linux, etc., deve gerar um novo arquivo executável, que é idêntico ao seu arquivo executável original, com nome aleatório e é encerrado.
Seu programa não deve envolver nenhum tipo de leitura ou cópia de arquivo. Somente gravação de arquivo para gerar novo arquivo executável é permitida.
(PS. Fiquei bastante envergonhado quando na Wikipedia, Self-replicating program
redireciona para o Computer virus
artigo ...: / ...)
O menor tamanho de arquivo executável vence. Sua resposta pode ser um código de programação com SO e compilador adequados, código de montagem ou despejo HEX de um arquivo executável.
Respostas:
Bash, 236
Mais do que o estritamente necessário, mas eu odeio longas filas. A nova linha à direita não é opcional.
fonte
Montagem para Linux x86, 106 bytes
Isto é para o montador nasm. Crie o binário com a linha de comando:
nasm -f bin -o a.out selfrep.asm && chmod +x a.out
Aqui está o mesmo arquivo que um dump 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
Conforme solicitado, o programa se copia para um arquivo separado. (O programa poderia ter sido significativamente mais curto se tivesse sido permitido apenas gravar no stdout e permitir que o usuário redirecionasse para um arquivo.)
Evitei usar truques limítrofes para reduzir o tamanho. Este deve ser um binário ELF de 32 bits totalmente compatível.
Editado para adicionar : Na versão acima, o arquivo criado é apenas um arquivo simples, mas me ocorre que, por alguns bytes (e uma pequena parte das regras), você pode criar algo um pouco mais interessante. Esta versão possui apenas dois bytes a 108 bytes:
Nomeie esta versão
asr
, para "um auto-replicador":nasm -f bin -o asr asr.asm && chmod +x asr
Versão de dump hexadecimal para pessoas com deficiência 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
Quando você o executa, ele cria um arquivo quase idêntico chamado
bsr
, mas que é ele próprio executável. A execução criará outro arquivo binário chamadocsr
. E assim por diante.(Observe que coisas irritantes começam a acontecer depois
zsr
. Pensei em criar uma versão que mudaria em cascata para o nomeatr
e assim por diante, mas acho que a maioria das pessoas ficará entediada antes disso, então provavelmente não vale todos os bytes extras. )fonte
A seguir, uma prova de conceito (não destruída) que mostra como os serviços de Compilação no .NET podem ser usados para compilar o código-fonte em tempo real para gerar uma saída idêntica. A primeira cópia não é idêntica ao original, mas as cópias subsequentes das execuções subsequentes são exatamente idênticas aos nomes de arquivos aleatórios:
Saída de demonstração na linha de comando:
fonte
Lote
Versão 1 (30 bytes)
Eu ganhei! :)
fonte
Arquivo COM DOS - 50 bytes
Cria um arquivo
X.COM
ondeX
é substituído pelo dígito das unidades da hora atual. Os arquivos COM são simplesmente carregados na memória no deslocamento100h
do segmento de dados (o CS e o DS estão configurados para serem os mesmos), para que possamos simplesmente gravar essa memória em um arquivo.fonte nasm
fonte
Arquivo .COM do DOS, 29 bytes
O '@' é substituído aleatoriamente por uma letra ímpar na primeira metade + parte do alfabeto (A, C, E, G, etc). Os arquivos de saída são 255 ou 256 bytes. Registradores iniciais no DOS real (em oposição a um depurador) são AX = 0000, CX = 00FF, SI = 0100.
fonte
Arquivo COM DOS - 36 bytes
O nome do arquivo de saída é especificado na linha de comando, truncado para o formato 8.3, espaços OK (os espaços nos nomes de arquivos do DOS são legais). Testado usando o prompt de comando WinXP.
fonte