Klonlayın!


13

Durdurulana kadar sonsuz olarak kendi klonlarını yaratan bir program oluşturmalısınız. Orijinal programda ne varsa klonlarda olmalıdır. Başka bir deyişle, klonlar ve orijinal program her şekilde aynıdır, ancak klonların kaynak koduyla aynı dosya türünde olması gerekmez (metin dosyaları olabilir).

Misal:

Orijinal programım:

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

klon ayrıca:

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

Kurallar ve Açıklamalar:

  • Standart boşluklar yasaktır

  • Klonlar orijinalin tam kopyası olmalıdır

  • Klonlar, doğru yorumlayıcıya yerleştirilirse çalıştırılabilecek okunabilir dosyalar olmalıdır

  • Program kendi kaynak kodunu okuyabilir

  • Tüm klonlar ayrı dosyalar olmalıdır

  • Programınızın yazdırılmasına izin verilmiyor

  • Dosya adları bayt sayısına dahil edilir

  • Klonların kaynak dosyayla aynı dizinde olması veya aynı dosya adını paylaşması gerekmez

  • En az 1000 klon oluşturulabilmelidir

Kazanan:

En az bayt kazanır!

Yanıtlar:


3

Zsh , 19 17 9 bayt

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

Meta üzerinde konsensüs başına , shebang bayt sayımından hariç tutulur.

Çevrimiçi deneyin!

TIO'nun forkbomb korumasının 113 dosya oluşturulduktan sonra işlemi öldüreceğini unutmayın. Bu tür muhafazakar kaynak sınırları olmadan bir sistemde kolayca 1000 dosya oluşturabilir.


Ben yes `<$0`|split -1çok daha iyi seviyorum , ama bu bayt sayısını iki katına çıkarır ...
Dennis

Çok kötü in-out böyle yönlendirme iyi çalışmaz bash Bir an için :( ben safça :) size outgolfed sanılan
zeplin

4

Toplu, 32 bayt

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

@STDOUT'ta herhangi bir kısıtlama olmadığı için kullanılmıyor . %1varsayılan olarak boş dizgidir, bu nedenle ilk seferde nolur 1ve her geçişte artış olur . Alternatif olarak, bu 28 bayt için işe yarayabilir, ancak %random%bu şekilde kullanıldığında nasıl rastgele olduğu hakkında hiçbir fikrim yok :

copy %0 %random%%random%
%0

2
IIRC %random%şimdiki zamana dayanır ve 0'dan 32.000'in biraz üzerine bir şey üretebilir.
user2428118

%random%Açıklığa kavuşturmak için, erişildiğinde, @ user2428118'de belirtildiği gibi rastgele bir sayı veren bir değişkendir.
Conor O'Brien

3

Bash, 25, 16, 12, 11 bayt

DÜZENLEMELER:

  • Yeni satır (-1 bayt) kaldırıldı, "Çevrimiçi Deneyin" eklendi. Teşekkürler @Dennis!
  • $!Dosya adı olarak arka plan işi PID'sini kullanın (her ~ 32k dosyada yeniden kullanılır, ancak buna artık izin verilir), -4 bayt

golfed

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

Açıklaması

Bir kopya yapmadan önce & ile arka plan işi olarak yeniden ortaya çıkar, böylece her yineleme kendi PID'si altında çalışır.

Son iş PID'sini dosya adı olarak kullanır.

Bu sonsuz olarak (veya durdurulana kadar) çalışabilir, ancak yaklaşık klon dosya adlarını yeniden kullanacaktır. her ~ 32k yineleme.

Öldürmek biraz kötü olabilir, ama AFAIK kurallara aykırı değildir.

Çevrimiçi Deneyin!


Bunu kendim deneyebileceğim bir test yeriniz var mı?
Anthony Pham

@PythonMaster, normalde Tutorial Point'in çevrimiçi test yatağını kullanacağım, ancak uuid yüklü değil ve betiğin çok fazla IO yapmasını sevmiyor.
zeppelin

TIO'nun G / Ç ile ilgili bir sorunu yok. Ayrıca, yeni satıra ihtiyacınız yok &. tio.run/nexus/bash#VY5BS8NAEIXP7q943W5tq6QpelMRRCIIGg/…
Dennis

3

Yakut, 78 bayt , 77 43 + 4 (dosya adı: a.rb) = 47 bayt

  • Sürüm 1.2

43 bytes + name / @Alexis sayesinde Çok daha kısa !!!

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

sanırım alacağı kadar golf oynamak

  • Sürüm 1.1

73 bayt + isim / @Alexis Anderson'a teşekkürler

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

74 bayt + ad

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

Bu benim ilk Ruby cevabım, bu yüzden tüm geliştirmeler açıktır.


çekirdek açık dosyaya ileriye doğru, Dosyayı atlayabilmeniz gerekir. tamamen. ? w yerine "w". File.open'deki işlemin işe yaramaz olduğunu düşünüyorum, çünkü kıvırcık parantezleriniz var.
Alexis Andersen

File.read ('a.rb') yerine açık ('a.rb',? r)
Alexis Andersen

? w bir karakterdir w. Kendi başına bir dize. ? w == 'w'. bu yüzden "? w" içindeki tırnak işaretlerine ihtiyacınız yok
Alexis Andersen

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

aslında, döngü yöntemi için de kıvırcık parantez kullanabilirsiniz
Alexis Andersen


2

C #, 104102 bayt

Berkeleybross sayesinde -2 bayt

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

Hayır, en kısa değil. Ama bu C #. Ne bekliyordun?


1
Bir ad alanına ihtiyacınız yoktur, böylece tam olarak niteleyebilirsiniz File.Copy. İnt bildirimini satır içine alabilmek ve 1>0parçayı kaldırabilmeniz için for döngüsüne geçmek . Ve artım öncesi ide File.Copysize 86 bayt verir açıklamada, inanıyorum:class P{static void Main(){for(int i=0;;)System.IO.File.Copy("c.cs","c"+ ++i+".cs");}}
TheLethalCoder

Aslında bu çalışmaz, çünkü c.csçıktı dizininde olmayacak ve oraya manuel olarak kopyalanmalıdır. Bu nasıl çalışıyor?
TheLethalCoder

Dont dize enterpolasyon unutun $"c{++i}.cs"2'den bayt kısadır"c"+ ++i+".cs"
berkeleybross

1

İşleniyor, 55 + 5 (dosya adı) = 60 bayt

Dosya adının fazladan bayt olarak sayıldığını bilmiyorum

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

Birbirine zincirlenmiş hemen hemen bir dizi yapı

açıklama

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

Bu "karmaşık kod" gülümsüyor
Roman Gräf

1

ForceLang + ForceLang-JS modülü , 162 bayt

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 bayt

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

Gerek yok import sysmu?
Samuel Shifterovich

@SamuelShifterovich olurdu. Kullanmakta olduğum bayt sayısı olarak bu düzenlemenin nasıl hayatta kaldığından emin değilim
Blue

1

Mathematica, 41 bayt

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

Tam program. Kopya kendi kaynak dosyası içine 0, 1, 2vb geçerli dizinde.


1

PHP, 91 60 bayt

Manatwork sayesinde 31 bayt tasarruf

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

Kullanımı: $ php f.phpklonlar f.phpve benzeri Dosya adlarında sonsuz kendisi yeniden kendi kod 1, 2, 3zaman aşımı kadar ....

Önceki versiyon:

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

Kullanımı: $ php f.phpklonlar f.phpve kodu çoğaltılması sonsuz kendisi gibi f1.php, f2.php, f3.php... f(n).phpzaman aşımı kadar.


Klon dosya adı herhangi bir şey olabileceğinden, neden sadece uzantısız sayıları kullanmıyorsunuz? <?for(;;)file_put_contents(++$i,file_get_contents("f.php"));
manatwork

0

awk, 29 (21) bayt,

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

awk, close()süresiz olarak çalıştığı için bunun için gerçekten bir araç değildir . Aksi takdirde tüm ürettiği boş dosyalardır.

Klon sayımının bir sınırı varsa, örneğin 5:

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

program 21 bayt olacaktır.

Programı bir dosyaya yapıştırın ave çalıştırın:

$ awk -f a a

0

Python, 69 bayt

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

aDosya adı için kullanmayı denedim , ancak (şaşırtıcı olmayan bir şekilde) Windows a=open(__file__).read()\ni=0\nwhile 1:i+=1;open(i adlı dosyaları sevmiyor +'.py','w').write(a). Ben de denedim:

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

Ancak bana bu hatayı veriyor:

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'

83 dosya oluşturur, ancak bu gerekli 1000 dosyaya bile yakın değildir.

Bu dosyaları kaldırmak istiyorsanız, bunu kullanabilirsiniz:

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

0

RBX.Lua, 14 bayt

BUNU BİLMİYORUM BİR DOSYA SİSTEMİ OLDU

script:Clone()

Kendini klonlar. Anlıklaştıkça tekrar çalışır, böylece otomatik özyineleme sağlar.


0

JavaScript ES6 34 bayt

Bunun önemli olup olmadığından emin değilim, ama burada:

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


0

Python 2,61 bayt (unix) 65 (çapraz platform)

Unix - 61 bayt

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

Unix cp'de sistem kopyalama dosyası - komutu. Konsolu popen ile kullanmak dosyayı cp ile kopyalamama izin veriyor. yeni dosyalar eski dosyalar dizininde ortaya çıkar.

CrossPlatform - 65 bayt

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

Bu, varsayılan açık okuma sağlar.

Funfact: değiştirmek 1:i+=1ile i:i-=1ve i kopya duracaktır.

Bunun dışında, bunu çamur balığı avından daha kısa yapmanın bir yolunu göremiyorum.


0

C, 80 bayt

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

Ölene kadar kendini yazdırır. Sonsuz bir döngü ile sadece standart bir C quine.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.