Tulis program sederhana yang menyalin dirinya sendiri ketika dieksekusi.
Program Anda harus berupa file yang dapat dieksekusi pada Windows, Linux, dll., Harus menghasilkan file yang dapat dieksekusi baru, yang identik dengan file yang dapat dieksekusi asli Anda, dengan nama acak, dan berhenti.
Program Anda seharusnya tidak melibatkan segala jenis membaca file atau menyalin. Hanya penulisan file untuk menghasilkan file yang dapat dieksekusi baru yang diizinkan.
(PS. Saya cukup malu ketika di Wikipedia, Self-replicating program
mengalihkan ke Computer virus
artikel ...: / ...)
Ukuran file terkecil yang dapat dieksekusi akan menang. Jawaban Anda mungkin berupa kode pemrograman dengan OS & compiler, kode assembly, atau dump HEX yang tepat dari file yang dapat dieksekusi.
Jawaban:
Bash, 236
Lebih lama dari yang seharusnya, tapi aku benci antrean panjang. Baris tambahan tidak bersifat opsional.
sumber
Perakitan untuk x86 Linux, 106 byte
Ini untuk assembler nasm. Bangun biner dengan baris perintah:
nasm -f bin -o a.out selfrep.asm && chmod +x a.out
Berikut file yang sama dengan hex dump:
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
Seperti yang diminta, program menyalin dirinya ke file terpisah. (Program bisa saja jauh lebih singkat jika diizinkan untuk hanya menulis ke stdout dan membiarkan pengguna mengarahkan ulang ke file.)
Saya menghindari menggunakan trik batas untuk mengurangi ukuran. Ini harus sepenuhnya biner ELF 32-bit.
Diedit untuk menambahkan : Dalam versi di atas file yang dibuat hanyalah file biasa, tetapi terpikir oleh saya bahwa untuk beberapa byte (dan sedikit tikungan aturan), Anda dapat membuat sesuatu yang sedikit lebih menarik. Versi ini hanya dua byte lebih panjang, pada 108 byte:
Beri nama versi ini
asr
, untuk "replikator diri":nasm -f bin -o asr asr.asm && chmod +x asr
Versi hex dump untuk orang yang mengalami gangguan nafas:
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
Ketika Anda menjalankannya, itu menciptakan file yang hampir identik bernama
bsr
, tetapi itu sendiri dapat dieksekusi. Menjalankannya akan membuat file biner lain bernamacsr
. Dan seterusnya.(Perhatikan bahwa hal-hal menjengkelkan mulai terjadi setelah itu
zsr
. Saya mempertimbangkan untuk membuat versi yang akan mengubah nama perubahanatr
dan sebagainya, tapi saya pikir kebanyakan orang akan bosan dengan baik sebelum itu, jadi mungkin tidak semua byte ekstra bernilai. )sumber
Berikut ini adalah bukti konsep (ungolfed) yang menunjukkan bagaimana layanan Kompilasi di .NET dapat digunakan untuk mengkompilasi kode sumber saat itu juga untuk menghasilkan output yang identik. Salinan pertama tidak identik dengan aslinya, tetapi salinan selanjutnya dari proses berikutnya persis sama dengan nama file acak:
Output demonstrasi pada baris perintah:
sumber
Batch
Versi 1 (30 byte)
Saya menang! :)
sumber
File DOS COM - 50 byte
Menciptakan file
X.COM
manaX
diganti dengan yang digit dari waktu saat ini. File COM hanya dimuat ke dalam memori pada offset100h
segmen data (CS dan DS diatur agar sama) sehingga kita dapat menuliskan memori ini ke sebuah file.sumber nasm
sumber
File DOS .COM, 29 byte
'@' Diganti secara acak dengan huruf aneh di bagian pertama + bagian alfabet (A, C, E, G, dll). File output adalah 255 atau 256 byte. Register awal dalam DOS nyata (sebagai lawan debugger) adalah AX = 0000, CX = 00FF, SI = 0100.
sumber
File DOS COM - 36 byte
Nama file output ditentukan pada baris perintah, terpotong ke format 8.3, spasi OK (spasi dalam nama file DOS legal). Diuji menggunakan prompt perintah WinXP.
sumber