Clonati!


13

Devi creare un programma che crea cloni esatti di se stesso all'infinito fino a quando non viene interrotto. Qualunque cosa sia nel programma originale deve essere nei cloni. In altre parole, i cloni e il programma originale sono gli stessi in tutti i modi, tranne per il fatto che i cloni non devono essere nello stesso tipo di file del codice sorgente (possono essere file di testo).

Esempio:

Se il mio programma originale è:

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

il clone deve anche essere:

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

Regole e chiarimenti:

  • Sono vietate le scappatoie standard

  • I cloni devono essere la copia esatta dell'originale

  • I cloni devono essere file leggibili che possono essere eseguiti se inseriti nell'interprete corretto

  • Il programma può leggere il proprio codice sorgente

  • Tutti i cloni devono essere file separati

  • La stampa del programma non è consentita

  • I nomi dei file contano nel numero di byte

  • I cloni non devono trovarsi nella stessa directory del file sorgente né condividere lo stesso nome file

  • Almeno 1000 cloni dovrebbero essere in grado di essere creati

Vincente:

Vince il minimo byte!

Risposte:


3

Zsh , 19 17 9 byte

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

Per consenso su meta , lo shebang è escluso dal conteggio dei byte.

Provalo online!

Si noti che la protezione forkbomb di TIO interromperà il processo dopo che sono stati generati 113 file. Può facilmente generare 1000 file su un sistema senza tali limiti di risorse conservativi.


Mi piace yes `<$0`|split -1molto di più, ma questo raddoppia il conteggio dei byte ...
Dennis,

Peccato che il reindirizzamento in-out in quel modo non funzioni bene in bash :( Per un momento, ho ingenuamente pensato di averti superato in astuzia :)
Zeppelin,

4

Lotto, 32 byte

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

Non usare @perché non ci sono restrizioni su STDOUT. %1il valore predefinito è la stringa vuota, quindi ndiventa 1la prima volta e aumenta ad ogni passaggio. In alternativa, questo potrebbe funzionare per 28 byte, ma non ho idea di come %random%sia effettivamente casuale quando usato in questo modo:

copy %0 %random%%random%
%0

2
IIRC %random%si basa sull'ora corrente e può generare qualcosa da 0 a qualcosa leggermente superiore a 32.000.
user2428118,

Per chiarire, %random%è una variabile che, quando vi si accede, produce un numero casuale come menzionato da @ user2428118.
Conor O'Brien,

3

bash, 25, 16, 12, 11 byte

Modifiche:

  • Rimossa la nuova riga (-1 byte), aggiunto "Provalo online". Grazie @Dennis!
  • Utilizza il PID del processo in background $!come nome file (verrà riutilizzato ogni ~ 32k file, ma ora è consentito), -4 byte

golfed

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

spiegato

Si ricompone come processo in background con &, prima di fare una copia, quindi ogni iterazione verrà eseguita con il proprio PID.

Utilizza l'ultimo PID del lavoro come nome file.

Questo può funzionare all'infinito (o fino a quando non viene arrestato) ma verrà riutilizzato i nomi dei file del clone per ca. ogni ~ 32k iterazioni.

Potrebbe essere un po 'brutto da uccidere, ma AFAIK non è contro le regole.

Provalo online!


Hai un luogo di prova in cui posso provarlo da solo?
Anthony Pham,

@PythonMaster, normalmente userò il banco di prova online di Tutorial Point, ma non è installato e non mi piace che lo script faccia così tanto IO.
Zeppelin,

TIO non ha problemi con l'I / O. Inoltre, non è necessario il newline dopo &. tio.run/nexus/bash#VY5BS8NAEIXP7q943W5tq6QpelMRRCIIGg/…
Dennis

3

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

  • Versione 1.2

43 byte + nome / Grazie a @Alexis Molto più breve !!!

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

è tanto golf quanto penso che diventerà

  • Versione 1.1

73 byte + nome / Grazie a @Alexis Anderson

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

74 byte + nome

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

Questa è la mia prima risposta di Ruby, quindi tutti i miglioramenti sono i benvenuti.


kernel aperto in avanti per aprire il file, dovresti essere in grado di omettere il File. del tutto. ? w al posto di "w". Penso che il do su File.open sia inutile, dal momento che hai le parentesi graffe.
Alexis Andersen,

open ('a.rb',? r) al posto di File.read ('a.rb')
Alexis Andersen,

? w è un personaggio w. Una stringa a sé stante. ? w == 'w'. quindi non hai bisogno delle virgolette in "? w"
Alexis Andersen il

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

in realtà, puoi anche usare le parentesi graffe per il metodo loop
Alexis Andersen il


2

C #, 104 102 byte

-2 byte grazie a berkeleybross

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

No, non è il più breve. Ma è C #. Cosa ti aspettavi?


1
Non è necessario uno spazio dei nomi in modo da poter qualificare completamente il file File.Copy. Passare a un ciclo for in modo da poter incorporare la dichiarazione int e rimuovere la 1>0parte. E pre incremento del inella File.Copydichiarazione, che ti da 86 byte credo:class P{static void Main(){for(int i=0;;)System.IO.File.Copy("c.cs","c"+ ++i+".cs");}}
TheLethalCoder

In realtà questo non funzionerà perché c.csnon si trova nella directory di output e deve essere copiato lì manualmente. Come funziona?
TheLethalCoder,

Non dimenticare che l'interpolazione di stringhe $"c{++i}.cs"è più corta di 2 byte rispetto a"c"+ ++i+".cs"
berkeleybross,

1

Elaborazione, 55 + 5 (nome del file) = 60 byte

Non so se il nome del file conta come byte extra

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

Praticamente una serie di builtin tutti incatenati insieme

Spiegazione

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

Quel "codice complesso" sorride
Roman Gräf,

1

ForceLang + il modulo 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

Non devi import sys?
Samuel Shifterovich il

@SamuelShifterovich avrei avuto. Non sono sicuro di come sia sopravvissuta quella modifica poiché il numero di byte che stavo usando era per il programma ora mostrato
Blue

1

Mathematica, 41 byte

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

Programma completo. Copie proprio nel file sorgente 0, 1, 2, ecc nella directory corrente.


1

PHP, 91 60 byte

Risparmiato 31 byte grazie alla manatwork

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

Uso: $ php f.phpcloni f.phpe il suo codice che riproduce all'infinito se stessa nei nomi dei file come 1, 2, 3... fino a quando il timeout.

Versione precedente:

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

Utilizzo: $ php f.phpcloni f.phpe il suo codice riprodursi all'infinito se stessa come f1.php, f2.php, f3.php... f(n).phpfino a quando il timeout.


Dato che il nome del file clone può essere qualsiasi cosa, perché non usare solo numeri senza estensione? <?for(;;)file_put_contents(++$i,file_get_contents("f.php"));
arte

0

awk, 29 (21) byte,

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

awk non è davvero lo strumento per questo in quanto richiede close()quando si esegue a tempo indeterminato. Altrimenti tutto ciò che produce sono file vuoti.

Se il conteggio dei cloni aveva un limite, ad esempio 5:

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

il programma sarebbe di 21 byte.

Incolla il programma in un file aed esegui:

$ awk -f a a

0

Python, 69 byte

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

Ho provato a utilizzare aper il nome del file, ma (non a caso) a Windows non piacciono i file di nome a=open(__file__).read()\ni=0\nwhile 1:i+=1;open(i +'.py','w').write(a). Ho anche provato questo:

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

Tuttavia mi dà questo errore:

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'

Crea 83 file, ma non è nemmeno vicino ai 1000 necessari.

Se desideri rimuovere questi file, puoi utilizzare questo:

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

0

RBX.Lua, 14 byte

È ANCHE UN FILESYSTEM CHE NON CONOSCO

script:Clone()

Clona stesso. Man mano che viene istanziato, corre di nuovo, fornendo quindi ricorsione automatica.


0

JavaScript ES6 34 byte

Non sono sicuro se questo conta, ma qui:

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


0

Python 2, 61 byte (unix) 65 (multipiattaforma)

Unix - 61 byte

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

Su unix cp c'è il comando copy-file - files. Utilizzo della console tramite popen mi consente di copiare il file tramite cp. i nuovi file verranno generati nella directory old-files.

CrossPlatform - 65 byte

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

Questo funziona, come aperto default consente la lettura.

Fatto divertente: sostituire 1:i+=1coni:i-=1 e si fermerà alle copie.

A parte questo, non vedo alcun modo di renderlo più breve di @muddyfish.


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);}

Stampa se stesso fino a quando non lo uccidi. Solo una quinina C standard con un ciclo infinito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.