Clonez-vous!

13

Vous devez créer un programme qui crée des clones exacts de lui-même à l'infini jusqu'à l'arrêt. Tout ce qui se trouve dans le programme d'origine doit être dans les clones. En d'autres termes, les clones et le programme d'origine sont les mêmes à tous égards, sauf que les clones ne doivent pas nécessairement être dans le même type de fichier que le code source (ils peuvent être des fichiers texte).

Exemple:

Si mon programme d'origine est:

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

le clone doit également être:

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

Règles et clarifications:

  • Les failles standard sont interdites

  • Les clones doivent être la copie exacte de l'original

  • Les clones doivent être des fichiers lisibles qui peuvent être exécutés s'ils sont placés dans le bon interpréteur

  • Le programme peut lire son propre code source

  • Tous les clones doivent être des fichiers séparés

  • L'impression de votre programme n'est pas autorisée

  • Les noms de fichiers comptent dans le nombre d'octets

  • Les clones ne doivent pas nécessairement se trouver dans le même répertoire que le fichier source ni partager le même nom de fichier

  • Au moins 1 000 clones devraient pouvoir être créés

Gagnant:

Le moins d'octets gagne!

Anthony Pham
la source

Réponses:

3

Zsh , 19 17 9 octets

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

Par consensus sur la méta , le shebang est exclu du nombre d'octets.

Essayez-le en ligne!

Notez que la protection forkbomb de TIO va tuer le processus après la génération de 113 fichiers. Il peut facilement générer 1 000 fichiers sur un système sans ces limites de ressources conservatrices.

Dennis
la source
J'aime yes `<$0`|split -1beaucoup mieux, mais cela double le nombre d'octets ...
Dennis
Dommage que la redirection in-out comme ça ne fonctionne pas bien en bash :( Pendant un moment, j'ai cru naïvement vous avoir déjoué :)
zeppelin
4

Lot, 32 octets

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

Ne pas utiliser @car il n'y a aucune restriction sur STDOUT. %1par défaut à la chaîne vide, ndevient donc 1la première fois et incrémente à chaque passage. Alternativement, cela pourrait fonctionner pour 28 octets, mais je n'ai aucune idée du caractère aléatoire %random%réel lorsqu'il est utilisé comme ceci:

copy %0 %random%%random%
%0
Neil
la source
2
L'IIRC %random%est basé sur l'heure actuelle et peut générer n'importe quoi de 0 à quelque chose d'un peu plus de 32 000.
user2428118
Pour clarifier, il %random%s'agit d'une variable qui, lorsqu'elle est consultée, donne un nombre aléatoire comme @ user2428118 l'a mentionné.
Conor O'Brien
3

Frapper, 25, 16, 12, 11 octets

MODIFICATIONS:

  • Suppression de la nouvelle ligne (-1 octet), ajout de "Try It Online". Merci @Dennis!
  • Utiliser le PID du job d'arrière-plan $!comme nom de fichier (sera réutilisé tous les ~ 32k fichiers, mais cela est désormais autorisé), -4 octets

Golfé

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

Expliqué

Se reproduit comme un travail d'arrière-plan avec &, avant de faire une copie, de sorte que chaque itération s'exécute sous son propre PID.

Utilise le dernier travail PID comme nom de fichier.

Cela peut s'exécuter à l'infini (ou jusqu'à ce qu'il soit arrêté) mais réutilisera les noms de fichiers des clones environ. toutes les ~ 32k itérations.

Cela pourrait être un peu méchant à tuer, mais l'AFAIK n'est pas contre les règles.

Essayez-le en ligne!

Zeppelin
la source
Avez-vous un lieu de test où je peux essayer par moi-même?
Anthony Pham
@PythonMaster, j'utiliserai normalement le banc d'essai en ligne de Tutorial Point, mais il n'a pas d'uuid installé et n'aime pas que le script fasse autant d'E / S.
zeppelin
TIO n'a pas de problème avec les E / S. De plus, vous n'avez pas besoin de la nouvelle ligne après &. tio.run/nexus/bash#VY5BS8NAEIXP7q943W5tq6QpelMRRCIIGg/…
Dennis
3

Ruby, 78 octets , 77 43 + 4 (nom de fichier: a.rb) = 47 octets

  • Version 1.2

43 octets + nom / Merci à @Alexis Beaucoup plus court !!!

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

c'est à peu près aussi golfé que je pense que ça va devenir

  • Version 1.1

73 octets + nom / Merci à @Alexis Anderson

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

74 octets + nom

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

Ceci est ma première réponse Ruby, donc toutes les améliorations sont les bienvenues.

Roman Gräf
la source
noyau ouvert pour ouvrir le fichier, vous devriez pouvoir omettre le fichier. tout à fait. ? w à la place de "w". Je pense que le faire sur le File.open est inutile, car vous avez les accolades.
Alexis Andersen
open ('a.rb',? r) à la place de File.read ('a.rb')
Alexis Andersen
? w est un caractère w. Une chaîne à part entière. ? w == 'w'. vous n'avez donc pas besoin des guillemets dans "? w"
Alexis Andersen
i = 0 boucle do File.write "# {i}", open ("a.rb",? r) i + = 1 end
Alexis Andersen
en fait, vous pouvez également utiliser des accolades pour la méthode de boucle
Alexis Andersen
2

sh, 24 octets

yes cp $0 '`uuid`'|sh -s
Rainer P.
la source
2

C #, 104 102 octets

-2 octets grâce à berkeleybross

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

Non, ce n'est pas le plus court. Mais c'est C #. Qu'est-ce que vous attendiez?

Hunter Robertson
la source
1
Vous n'avez pas besoin d'un espace de noms, vous pouvez donc entièrement qualifier le File.Copy. Passer à une boucle for pour pouvoir aligner la déclaration int et supprimer la 1>0partie. Et pré incrémentez le idans la File.Copydéclaration, cela vous donne 86 octets je crois:class P{static void Main(){for(int i=0;;)System.IO.File.Copy("c.cs","c"+ ++i+".cs");}}
TheLethalCoder
En fait, cela ne fonctionnera pas car c.csne sera pas dans le répertoire de sortie et doit y être copié manuellement. Comment cela marche-t-il?
TheLethalCoder
N'oubliez pas que l'interpolation de chaîne $"c{++i}.cs"est 2 octets plus courte que"c"+ ++i+".cs"
berkeleybross
1

Traitement, 55 + 5 (nom du fichier) = 60 octets

Je ne sais pas si le nom de fichier compte comme octets supplémentaires

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

À peu près une série de structures toutes enchaînées

Explication

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
la source
Ce "code complexe" sourit
Roman Gräf
1

ForceLang + le module ForceLang-JS , 162 octets

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
la source
1

Python 2, 54 octets

from shutil import*
a=__file__
while`copy(a,a*2)`:a*=2
Bleu
la source
Tu n'es pas obligé import sys?
Samuel Shifterovich
@SamuelShifterovich j'aurais eu. Je ne sais pas comment cette modification a survécu car le nombre d'octets que j'utilisais était pour le programme maintenant affiché
Blue
1

Mathematica, 41 octets

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

Programme complet. Des copies dans son propre fichier source 0, 1, 2, etc. dans le répertoire courant.

LegionMammal978
la source
1

PHP, 91 60 octets

Économie de 31 octets grâce à la gestion

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

Utilisation: $ php f.phpclones f.phpet son code reproduisant lui - même dans l' infini des noms comme 1, 2, 3... jusqu'à ce délai d' attente.

La version précédente:

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

Utilisation: $ php f.phpclones f.phpet sa reproduction de code lui - même comme infiniment f1.php, f2.php, f3.php... f(n).phpjusqu'à ce délai d' attente.

Mario
la source
Comme le nom du fichier clone peut être n'importe quoi, pourquoi ne pas utiliser uniquement des numéros sans extension? <?for(;;)file_put_contents(++$i,file_get_contents("f.php"));
manatwork
0

awk, 29 (21) octets,

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

awk n'est pas vraiment l'outil pour cela car il nécessite une close()exécution indéfinie. Sinon, il ne produit que des fichiers vides.

Si le nombre de clones avait une limite, par exemple 5:

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

le programme serait de 21 octets.

Collez le programme dans un fichier aet exécutez:

$ awk -f a a
James Brown
la source
0

Python, 69 octets

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

J'ai essayé d'utiliser ale nom de fichier, mais (sans surprise) Windows n'aime pas les fichiers nommés a=open(__file__).read()\ni=0\nwhile 1:i+=1;open(i +'.py','w').write(a). J'ai également essayé ceci:

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

Cependant cela me donne cette erreur:

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'

Il crée 83 fichiers, mais ce n'est même pas proche des 1000 nécessaires.

Si vous souhaitez supprimer ces fichiers, vous pouvez utiliser ceci:

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

RBX.Lua, 14 octets

EST-CE MÊME UN SYSTÈME DE FICHIERS QUE JE NE SAIS PAS

script:Clone()

Se clone. Au fur et à mesure qu'il s'instancie, il s'exécute à nouveau, offrant ainsi une récursivité automatique.

devRicher
la source
0

JavaScript ES6 34 octets

Je ne sais pas si cela compte, mais ici:

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

Kuilin Li
la source
0

Python 2, 61 octets (unix) 65 (multiplateforme)

Unix - 61 octets

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

Sur unix cp se trouve la commande copy-file - du système. L'utilisation de la console via popen me permet de copier le fichier par cp. les nouveaux fichiers apparaîtront dans le répertoire des anciens fichiers.

CrossPlatform - 65 octets

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

Cela fonctionne, car ouvert par défaut permet la lecture.

Funfact: remplacez 1:i+=1par i:i-=1et il s'arrêtera à i copies.

En dehors de cela, je ne vois aucun moyen de le raccourcir par rapport à @muddyfish.

Teck-freak
la source
0

C, 80 octets

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

S'imprime jusqu'à ce que vous le tuiez. Juste un quine C standard avec une boucle infinie.

MD XF
la source