Kloning diri sendiri!


13

Anda harus membuat program yang membuat klon tepat dari dirinya sendiri hingga tak terhingga. Apa pun yang ada di program asli harus ada di klon. Dengan kata lain, klon dan program asli sama dalam segala hal kecuali untuk itu klon tidak harus berada dalam jenis file yang sama dengan kode sumber (mereka bisa berupa file teks).

Contoh:

Jika program asli saya adalah:

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

klon juga harus:

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

Aturan dan Klarifikasi:

  • Celah standar dilarang

  • Klon harus salinan yang tepat dari aslinya

  • Klon harus berupa file yang dapat dibaca yang dapat dijalankan jika diletakkan di dalam interpreter yang benar

  • Program dapat membaca kode sumbernya sendiri

  • Semua klon harus berupa file terpisah

  • Mencetak program Anda tidak diizinkan

  • Nama file dihitung dalam jumlah byte

  • Klon tidak harus berada di direktori yang sama dengan file sumber atau berbagi nama file yang sama

  • Setidaknya 1000 klon harus dapat dibuat

Kemenangan:

Bytes terkecil menang!

Jawaban:


3

Zsh , 19 17 9 byte

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

Per konsensus tentang meta , shebang dikeluarkan dari jumlah byte.

Cobalah online!

Perhatikan bahwa perlindungan forkbomb TIO akan mematikan proses setelah 113 file dihasilkan. Itu dapat dengan mudah menghasilkan 1000 file pada suatu sistem tanpa batasan sumber daya yang konservatif.


Saya suka yes `<$0`|split -1jauh lebih baik, tetapi itu menggandakan jumlah byte ...
Dennis

Sayang sekali pengalihan masuk-keluar seperti itu tidak berfungsi dengan baik di bash :( Untuk satu saat, aku dengan naif mengira telah mengungguli kamu :)
zeppelin

4

Batch, 32 byte

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

Tidak menggunakan @karena tidak ada batasan pada STDOUT. %1default ke string kosong, jadi nmenjadi 1yang pertama kali dan peningkatan pada setiap pass. Atau, ini mungkin bekerja selama 28 byte, tetapi saya tidak tahu seberapa acak %random%sebenarnya ketika digunakan seperti ini:

copy %0 %random%%random%
%0

2
IIRC %random%didasarkan dari waktu saat ini dan dapat menghasilkan apa pun dari 0 hingga sesuatu yang sedikit di atas 32.000.
user2428118

Untuk memperjelas, %random%adalah variabel yang, ketika diakses, menghasilkan angka acak seperti yang disebutkan @ user2428118.
Conor O'Brien

3

Pesta, 25, 16, 12, 11 byte

EDIT:

  • Menghapus baris baru (-1 byte), Menambahkan "Coba Daring". Terima kasih @Dennis!
  • Gunakan PID pekerjaan latar belakang $!sebagai nama file (akan digunakan kembali setiap ~ 32k file, tetapi sekarang diizinkan), -4 byte

Golf

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

Dijelaskan

Memunculkan kembali dirinya sebagai pekerjaan latar belakang dengan &, sebelum melakukan salinan, sehingga setiap iterasi akan berjalan di bawah PID sendiri.

Menggunakan PID pekerjaan terakhir sebagai nama file.

Ini dapat berjalan tanpa batas (atau sampai dihentikan) tetapi akan menggunakan kembali nama file klon kira-kira. setiap ~ 32k iterasi.

Bisa jadi agak jahat untuk membunuh, tetapi AFAIK tidak melanggar aturan.

Cobalah secara Online!


Apakah Anda memiliki tempat pengujian di mana saya dapat mencobanya sendiri?
Anthony Pham

@ PythonMaster, saya biasanya akan menggunakan testbed online Tutorial Point, tetapi tidak memiliki uuid yang diinstal, dan tidak suka skrip melakukan begitu banyak IO.
zeppelin

TIO tidak memiliki masalah dengan I / O. Anda juga tidak perlu baris baru setelah itu &. tio.run/nexus/bash#VY5BS8NAEIXP7q943W5tq6QpelMRRCIIGg/...
Dennis

3

Ruby, 78 byte , 77 43 + 4 (nama file: a.rb) = 47 byte

  • Versi 1.2

43 byte + nama / Terima kasih kepada @Alexis Jauh lebih pendek !!!

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

itu tentang golf seperti yang saya pikir akan dapatkan

  • Versi 1.1

73 byte + nama / Terima kasih kepada @Alexis Anderson

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

74 byte + nama

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

Ini adalah jawaban Ruby pertama saya, jadi semua perbaikan masih dalam proses.


kernel membuka ke depan untuk membuka file, Anda harus dapat menghilangkan File. sama sekali. ? w di tempat "w". Saya pikir do pada File.open tidak berguna, karena Anda memiliki kurung kurawal.
Alexis Andersen

buka ('a.rb',? r) sebagai ganti File.read ('a.rb')
Alexis Andersen

? w adalah karakter w. Sebuah string di dalamnya benar. ? w == 'w'. jadi Anda tidak perlu tanda kutip di "? w"
Alexis Andersen

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

sebenarnya, Anda juga dapat menggunakan kurung kurawal untuk metode loop juga
Alexis Andersen


2

C #, 104 102 byte

-2 byte berkat berkeleybross

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

Tidak, ini bukan yang terpendek. Tapi itu C #. Apa yang kamu harapkan?


1
Anda tidak memerlukan ruang nama sehingga Anda dapat sepenuhnya memenuhi syarat File.Copy. Mengubah ke loop untuk sehingga Anda bisa inline deklarasi int dan menghapus 1>0bagian. Dan pra kenaikan idalam File.Copypernyataan itu, yang memberi Anda 86 byte saya percaya:class P{static void Main(){for(int i=0;;)System.IO.File.Copy("c.cs","c"+ ++i+".cs");}}
TheLethalCoder

Sebenarnya ini tidak akan berhasil karena c.cstidak akan ada di direktori output dan harus disalin secara manual. Bagaimana cara kerjanya?
TheLethalCoder

Jangan lupa tentang interpolasi string $"c{++i}.cs"2 byte lebih pendek dari"c"+ ++i+".cs"
berkeleybross

1

Memproses, 55 + 5 (nama file) = 60 byte

Saya tidak tahu apakah nama file dianggap sebagai byte tambahan

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

Cukup banyak serangkaian builtin semua dirantai bersama

Penjelasan

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

"Kode kompleks" itu sedang tersenyum
Roman Gräf

1

ForceLang + modul ForceLang-JS , 162 byte

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 byte

from shutil import*
a=__file__
while`copy(a,a*2)`:a*=2

Bukankah kamu harus import sys?
Samuel Shifterovich

@SamuelShifterovich saya akan punya. Saya tidak yakin bagaimana hasil edit itu bertahan karena jumlah byte yang saya gunakan untuk program yang sekarang ditampilkan
Biru

1

Mathematica, 41 byte

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

Program lengkap. Salinan sendiri file sumber ke dalam nya 0, 1, 2, dll di direktori saat ini.


1

PHP, 91 60 byte

Disimpan 31 byte berkat manatwork

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

Penggunaan: $ php f.phpklon f.phpdan kode mereproduksi jauh itu sendiri dalam nama file seperti 1, 2, 3... sampai batas waktu.

Versi sebelumnya:

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

Penggunaan: $ php f.phpklon f.phpdan kode bereproduksi yang jauh itu sendiri seperti f1.php, f2.php, f3.php... f(n).phpsampai batas waktu.


Karena nama file klon dapat berupa apa saja, mengapa tidak menggunakan nomor saja tanpa ekstensi? <?for(;;)file_put_contents(++$i,file_get_contents("f.php"));
manatwork

0

awk, 29 (21) byte,

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

awk sebenarnya bukan alat untuk ini karena membutuhkan close()saat berjalan tanpa batas. Kalau tidak semua yang dihasilkannya adalah file kosong.

Jika jumlah klon memiliki batas, misalnya 5:

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

program ini akan menjadi 21 byte.

Tempel program ke file adan jalankan:

$ awk -f a a

0

Python, 69 byte

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

Saya mencoba menggunakan auntuk nama file, tetapi (tidak mengherankan) Windows tidak suka file bernama a=open(__file__).read()\ni=0\nwhile 1:i+=1;open(i +'.py','w').write(a). Saya juga mencoba ini:

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

Namun itu memberi saya kesalahan ini:

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'

Ini menciptakan 83 file, tetapi itu bahkan tidak dekat dengan 1000 yang dibutuhkan.

Jika Anda ingin menghapus file-file ini, Anda dapat menggunakan ini:

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

0

RBX.Lua, 14 byte

INI BAHKAN A FILESYSTEM Saya TIDAK TAHU

script:Clone()

Klon itu sendiri. Ketika hal itu diberlakukan, dalam menjalankan lagi, karena itu memberikan rekursi otomatis.


0

JavaScript ES6 34 byte

Tidak yakin apakah ini diperhitungkan, tetapi di sini:

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


0

Python 2, 61 byte (unix) 65 (lintas-platform)

Unix - 61 byte

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

Pada unix cp adalah sistem copy-file - command. Menggunakan konsol via popen memungkinkan saya untuk menyalin file dengan cp. file baru akan muncul di direktori file lama.

CrossPlatform - 65 byte

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

Ini berfungsi, karena terbuka pada pengaturan standar memungkinkan membaca.

Funfact: ganti 1:i+=1dengan i:i-=1dan itu akan berhenti di i copy.

Selain itu, saya tidak melihat cara membuatnya lebih pendek dari @muddyfish yang melakukannya.


0

C, 80 byte

main(a){while(1)printf(a="main(a){while(1)printf(a=%c%s%c,34,a,34);}",34,a,34);}

Mencetak dirinya sendiri sampai Anda membunuhnya. Hanya standar C quine dengan infinite loop.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.