Sklonuj siebie!

13

Masz stworzyć program, który tworzy nieskończenie dokładne klony, dopóki się nie zatrzyma. Cokolwiek jest w oryginalnym programie, musi znajdować się w klonach. Innymi słowy, klony i oryginalny program są takie same pod każdym względem, z tym wyjątkiem, że klony nie muszą znajdować się w tym samym typie pliku, co kod źródłowy (mogą to być pliki tekstowe).

Przykład:

Jeśli mój oryginalny program to:

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

klon musi być również:

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

Zasady i wyjaśnienia:

  • Standardowe luki są zabronione

  • Klony muszą być dokładną kopią oryginału

  • Klony muszą być czytelnymi plikami, które można uruchomić, jeśli zostaną umieszczone w poprawnym tłumaczu

  • Program może odczytać własny kod źródłowy

  • Wszystkie klony muszą być osobnymi plikami

  • Wydrukowanie programu jest niedozwolone

  • Nazwy plików liczą się do liczby bajtów

  • Klony nie muszą znajdować się w tym samym katalogu co plik źródłowy ani nie mogą mieć tej samej nazwy pliku

  • Powinno być możliwe utworzenie co najmniej 1000 klonów

Zwycięski:

Najmniej bajtów wygrywa!

Anthony Pham
źródło

Odpowiedzi:

3

Zsh , 19 17 9 bajtów

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

Zgodnie z konsensusem w sprawie meta , shebang jest wykluczony z liczby bajtów.

Wypróbuj online!

Zauważ, że ochrona widełek TIO zabije proces po wygenerowaniu 113 plików. Może łatwo wygenerować 1000 plików w systemie bez takich konserwatywnych limitów zasobów.

Dennis
źródło
Lubię yes `<$0`|split -1znacznie lepiej, ale to podwaja liczbę bajtów ...
Dennis
Szkoda, że ​​takie przekierowanie wejściowe nie działa dobrze w bash :( Przez chwilę naiwnie myślałem, że cię wygram :)
zeppelin
4

Partia, 32 bajty

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

Nie używasz, @ponieważ nie ma ograniczeń dotyczących STDOUT. %1domyślnie jest to pusty ciąg, więc nstaje 1się pierwszy raz i zwiększa się przy każdym przejściu. Alternatywnie może to działać dla 28 bajtów, ale nie mam pojęcia, jak losowy %random%jest w rzeczywistości, gdy jest używany w następujący sposób:

copy %0 %random%%random%
%0
Neil
źródło
2
IIRC %random%opiera się na bieżącym czasie i może wygenerować wszystko od 0 do czegoś nieco powyżej 32 000.
user2428118,
Aby to wyjaśnić, %random%jest zmienną, która po uzyskaniu dostępu zwraca liczbę losową, jak wspomniano w @ user2428118.
Conor O'Brien
3

Grzmotnąć, 25, 16, 12, 11 bajtów

EDYCJE:

  • Usunięto nowy wiersz (-1 bajt), dodano „Wypróbuj online”. Dzięki @Dennis!
  • Użyj PID zadania w tle $!jako nazwy pliku (będzie ponownie używany co ~ 32k plików, ale jest to teraz dozwolone), -4 bajty

Grał w golfa

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

Wyjaśniono

Ponownie spawnuje się jako zadanie w tle z &, przed zrobieniem kopii, więc każda iteracja będzie działać pod własnym PID.

Używa PID ostatniego zadania jako nazwy pliku.

Może to działać nieskończenie (lub aż do zatrzymania), ale będzie ponownie wykorzystywać nazwy plików klon ok. co ~ 32k iteracji.

Zabijanie może być trochę nieprzyjemne, ale AFAIK nie jest niezgodny z zasadami.

Wypróbuj online!

zepelin
źródło
Czy masz miejsce testowe, w którym mogę to sprawdzić na własne oczy?
Anthony Pham,
@PythonMaster, zwykle użyję testbed online Tutorial Point, ale nie ma zainstalowanego UUID i nie podoba się skryptowi, który robi tyle IO.
zeppelin
TIO nie ma problemu z I / O. Nie potrzebujesz też nowej linii po &. tio.run/nexus/bash#VY5BS8NAEIXP7q943W5tq6QpelMRRCIIGg/…
Dennis
3

Rubinowy, 78 bajtów , 77 43 + 4 (nazwa pliku: a.rb) = 47 bajtów

  • Wersja 1.2

43 bajty + nazwa / Dzięki @Alexis O wiele krócej !!!

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

to jest tak golfa, jak myślę, że będzie

  • Wersja 1.1

73 bajty + nazwa / Podziękowania dla @Alexis Anderson

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

74 bajty + nazwa

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

To moja pierwsza odpowiedź w języku Ruby, więc wszelkie poprawki są mile widziane.

Roman Gräf
źródło
jądro otwarte do przodu, aby otworzyć plik, powinieneś być w stanie pominąć plik. całkowicie. ? w zamiast „w”. Uważam, że operacja na File.open jest bezużyteczna, ponieważ masz nawiasy klamrowe.
Alexis Andersen
open ('a.rb',? r) zamiast File.read ('a.rb')
Alexis Andersen
? w jest postacią w. Sznurek sam w sobie. ? w == 'w'. więc nie potrzebujesz cytatów w „? w”
Alexis Andersen
i = 0 pętla do File.write "# {i}", otwórz ("a.rb",? r) i + = 1 koniec
Alexis Andersen
w rzeczywistości można również używać nawiasów klamrowych do metody pętli
Alexis Andersen
2

sh, 24 bajty

yes cp $0 '`uuid`'|sh -s
Rainer P.
źródło
2

C #, 104 102 bajtów

-2 bajty dzięki berkeleybross

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

Nie, to nie jest najkrótsze. Ale to C #. Czego oczekiwałeś?

Hunter Robertson
źródło
1
Nie potrzebujesz przestrzeni nazw, aby móc w pełni zakwalifikować się File.Copy. Zmiana na pętlę for, aby można było wstawić deklarację int i usunąć 1>0część. I pre zwiększamy iw File.Copyoświadczeniu, że daje 86 bajtów wierzę:class P{static void Main(){for(int i=0;;)System.IO.File.Copy("c.cs","c"+ ++i+".cs");}}
TheLethalCoder
W rzeczywistości to nie zadziała, ponieważ c.csnie będzie w katalogu wyjściowym i trzeba go tam skopiować ręcznie. Jak to działa?
TheLethalCoder
Nie zapomnij o interpolacji ciągów o $"c{++i}.cs"2 bajty krótszej niż"c"+ ++i+".cs"
berkeleybross,
1

Przetwarzanie, 55 + 5 (nazwa pliku) = 60 bajtów

Nie wiem, czy nazwa pliku liczy się jako dodatkowe bajty

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

Prawie seria wbudowanych elementów połączonych razem

Wyjaśnienie

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[]
);
user41805
źródło
Ten „złożony kod” się uśmiecha
Roman Gräf,
1

ForceLang + moduł ForceLang-JS , 162 bajty

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
źródło
1

Python 2, 54 bajty

from shutil import*
a=__file__
while`copy(a,a*2)`:a*=2
niebieski
źródło
Nie masz do import sys?
Samuel Shifterovich,
@SamuelShifterovich Chciałbym. Nie jestem pewien, jak ta edycja przetrwała, ponieważ liczba bajtów, której użyłem, była dla pokazanego programu
Blue
1

Mathematica, 41 bajtów

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

Pełny program Kopiuje swój własny do pliku źródłowego 0, 1, 2, itd. W bieżącym katalogu.

LegionMammal978
źródło
1

PHP, 91 60 bajtów

Zaoszczędzono 31 bajtów dzięki manatwork

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

Zastosowanie: $ php f.phpklony f.phpi odtwarzając jego kod nieskończenie sama w nazwach takich jak 1, 2, 3... aż do czasu zakończenia.

Poprzednia wersja:

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

Zastosowanie: $ php f.phpklony f.phpi jego kod odtwarzający nieskończenie sama lubię f1.php, f2.php, f3.php... f(n).php, aż timeout.

Mario
źródło
Skoro nazwa pliku klonowania może być dowolna, dlaczego nie użyć tylko liczb bez rozszerzenia? <?for(;;)file_put_contents(++$i,file_get_contents("f.php"));
manatwork
0

awk, 29 (21) bajtów,

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

awk nie jest tak naprawdę narzędziem do tego, ponieważ wymaga ono close()działania w nieskończoność. W przeciwnym razie wszystko, co tworzy, to puste pliki.

Jeśli liczba klonów miała limit, na przykład 5:

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

program miałby 21 bajtów.

Wklej program do pliku ai uruchom:

$ awk -f a a
James Brown
źródło
0

Python, 69 bajtów

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

Próbowałem użyć anazwy pliku, ale (co nie jest zaskoczeniem) system Windows nie lubi plików o nazwie a=open(__file__).read()\ni=0\nwhile 1:i+=1;open(i +'.py','w').write(a). Próbowałem także:

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

Daje mi to jednak błąd:

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'

Tworzy 83 pliki, ale to nie jest nawet blisko potrzebnego 1000.

Jeśli chcesz usunąć te pliki, możesz użyć tego:

import os;i = 1
while 1:os.remove(`i`+'.py');i+=1
nedla2004
źródło
0

RBX.Lua, 14 bajtów

CZY TO JEST NAWET SYSTEMU PLIKÓW, NIE WIEM

script:Clone()

Klony same. Gdy się pojawi, uruchamia się ponownie, zapewniając automatyczną rekurencję.

devRicher
źródło
0

JavaScript ES6 34 bajty

Nie jestem pewien, czy to się liczy, ale tutaj:

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

Kuilin Li
źródło
0

Python 2, 61 bajtów (unix) 65 (wieloplatformowy)

Unix - 61 bajtów

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

Na unixie cp jest to systemowa kopia pliku - polecenie. Używanie konsoli przez popen pozwala mi skopiować plik przez cp. nowe pliki pojawią się w katalogu starych plików.

CrossPlatform - 65 bajtów

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

Działa, ponieważ domyślnie otwarty umożliwia czytanie.

Funfact: wymienić 1:i+=1z i:i-=1i zatrzyma przy I kopii.

Poza tym nie widzę sposobu, aby był krótszy niż @muddyfish.

Dziwak
źródło
0

C, 80 bajtów

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

Drukuje się, dopóki go nie zabijesz. Po prostu standardowa Quine C z nieskończoną pętlą.

MD XF
źródło