Клонируй себя!

13

Вы должны создать программу, которая создает точные клоны себя бесконечно, пока не остановится. Все, что есть в оригинальной программе, должно быть в клонах. Другими словами, клоны и исходная программа одинаковы во всех отношениях, за исключением того, что клоны не обязательно должны находиться в файле того же типа, что и исходный код (они могут быть текстовыми файлами).

Пример:

Если моя оригинальная программа:

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

клон также должен быть:

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

Правила и разъяснения:

  • Стандартные лазейки запрещены

  • Клоны должны быть точной копией оригинала

  • Клоны должны быть читаемыми файлами, которые можно запустить, если поместить в правильный интерпретатор

  • Программа может читать свой собственный исходный код

  • Все клоны должны быть отдельными файлами

  • Печать вашей программы не разрешена

  • Имена файлов учитываются в количестве байтов

  • Клоны не обязательно должны находиться в том же каталоге, что и исходный файл, и не должны иметь одно и то же имя.

  • Должно быть создано не менее 1000 клонов.

Выигрыш:

Меньше байтов побеждает!

Энтони Фам
источник

Ответы:

3

Зш , 19 17 9 байт

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

В соответствии с консенсусом по мета , шебанг исключается из числа байтов.

Попробуйте онлайн!

Обратите внимание, что защита от Tomb с помощью forkbomb убьет процесс после генерации 113 файлов. Он может легко генерировать 1000 файлов в системе без таких консервативных ограничений ресурсов.

Деннис
источник
Мне нравится yes `<$0`|split -1намного лучше, но это удваивает количество байтов ...
Деннис
Жаль , что в выход Перенаправление как это не очень хорошо работает в Баш :( За один момент, я наивно думал, что outgolfed вам :)
дирижабль
4

Пакетная, 32 байта

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

Не используется, @потому что нет ограничений на STDOUT. %1по умолчанию используется пустая строка, поэтому nстановится 1первым и увеличивается на каждый проход. В качестве альтернативы, это может работать для 28 байтов, но я понятия не имею, насколько случайным на %random%самом деле является случай, когда используется так:

copy %0 %random%%random%
%0
Нил
источник
2
IIRC %random%основан на текущем времени и может генерировать от 0 до чуть более 32 000.
user2428118
Для пояснения, %random%это переменная, которая при обращении выдает случайное число, указанное @ user2428118.
Конор О'Брайен
3

Bash, 25, 16, 1211 байт

правок:

  • Удален перевод строки (-1 байт), добавлено «Попробуйте онлайн». Спасибо @Dennis!
  • Использовать PID фонового задания в $!качестве имени файла (будет повторно использоваться каждые ~ 32k файлов, но теперь это разрешено), -4 байта

Golfed

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

Разъяснения

Повторно порождает себя как фоновое задание с & перед выполнением копирования, поэтому каждая итерация будет выполняться под своим собственным PID.

Использует последний PID задания в качестве имени файла.

Это может выполняться бесконечно (или до тех пор, пока не остановится), но будет повторно использовать имена клонов ок. каждые ~ 32к итераций.

Может быть немного неприятно убивать, но AFAIK не против правил.

Попробуйте онлайн!

дирижабль
источник
У вас есть место для тестирования, где я могу попробовать это для себя?
Энтони Фам
@PythonMaster, я обычно использую онлайн-тестирование Tutorial Point, но на нем не установлен uuid и ему не нравится, когда скрипт выполняет так много операций ввода-вывода.
zeppelin
TIO не имеет проблем с вводом / выводом. Кроме того, вам не нужен перевод строки после &. tio.run/nexus/bash#VY5BS8NAEIXP7q943W5tq6QpelMRRCIIGg/…
Деннис
3

Ruby, 78 байт , 77 43 + 4 (имя файла: a.rb) = 47 байт

  • Версия 1.2

43 байта + имя / Спасибо @Alexis Так намного короче !!!

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

это примерно так же, как я думаю, что он собирается получить

  • Версия 1.1

73 байта + имя / Спасибо @Alexis Anderson

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

74 байта + имя

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

Это мой первый ответ на Ruby, так что все предложения приветствуются.

Роман Греф
источник
Ядро открывается вперед, чтобы открыть файл, вы должны быть в состоянии опустить файл. в целом. ? W вместо "W". Я думаю, что делать на File.open бесполезно, так как у вас есть фигурные скобки.
Алексис Андерсен
открыть ('a.rb',? r) вместо File.read ('a.rb')
Алексис Андерсен,
? w это символ w. Строка сама по себе. ? w == 'w'. так что вам не нужны кавычки в "? w"
Алексис Андерсен
i = 0 loop do File.write "# {i}", open ("a.rb",? r) i + = 1 end
Алексис Андерсен
на самом деле, вы также можете использовать фигурные скобки для метода цикла
Алексис Андерсен
2

ш, 24 байта

yes cp $0 '`uuid`'|sh -s
Райнер П.
источник
2

C #, 104 102 байта

-2 байта благодаря берклиброссу

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

Нет, это не самое короткое. Но это C #. Чего ты ожидал?

Охотник Робертсон
источник
1
Вам не нужно пространство имен, чтобы вы могли полностью определить File.Copy. Перейдя в цикл for, вы сможете встроить объявление int и удалить 1>0деталь. И заранее приращение iв File.Copyзаявлении, что дает вам 86 байт Я считаю , что:class P{static void Main(){for(int i=0;;)System.IO.File.Copy("c.cs","c"+ ++i+".cs");}}
TheLethalCoder
На самом деле это не сработает, потому c.csчто не будет находиться в выходном каталоге и должно быть скопировано туда вручную. Как это работает?
TheLethalCoder
Не забывайте, что интерполяция строк на $"c{++i}.cs"2 байта короче, чем"c"+ ++i+".cs"
berkeleybross
1

Обработка, 55 + 5 (имя файла) = 60 байт

Я не знаю, считается ли имя файла как лишние байты

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

Довольно много встроенных цепочек

объяснение

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
источник
Этот «сложный код» улыбается
Роман Грэф
1

ForceLang + модуль ForceLang-JS , 162 байта

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
источник
1

Python 2, 54 байта

from shutil import*
a=__file__
while`copy(a,a*2)`:a*=2
синий
источник
Тебе не нужно import sys?
Самуил Шифтерович
@SamuelShifterovich Я бы так и сделал. Я не уверен, как это редактирование сохранилось, так как количество байтов, которое я использовал, было для показанной программы
Blue
1

Mathematica, 41 байт

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

Полная программа. Копии его собственный исходный файл в 0, 1, 2и т.д. в текущем каталоге.

LegionMammal978
источник
1

PHP, 91 60 байт

Saved 31 bytes thanks to manatwork

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

Usage: $ php f.php clones f.php and its code reproducing infinitely itself in filenames like 1, 2, 3... until timeout.

Previous version:

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

Usage: $ php f.php clones f.php and its code reproducing infinitely itself like f1.php, f2.php, f3.php ... f(n).php until timeout.

Марио
источник
Поскольку имя файла клона может быть любым, почему бы не использовать только цифры без расширения? <?for(;;)file_put_contents(++$i,file_get_contents("f.php"));
Манатворк
0

awk, 29 (21) байт,

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

awk на самом деле не инструмент для этого, поскольку он требуется close()при работе на неопределенный срок. Иначе все, что это производит, является пустыми файлами.

Если количество клонов имело ограничение, например 5:

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

программа будет 21 байт.

Вставьте программу в файл aи запустите:

$ awk -f a a
Джеймс Браун
источник
0

Python, 69 байт

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

Я попытался использовать aдля имени файла, но (неудивительно), что Windows не любит файлы с именем a=open(__file__).read()\ni=0\nwhile 1:i+=1;open(i +'.py','w').write(a). Я также попробовал это:

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

Однако это дает мне эту ошибку:

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 файла, но это даже не близко к необходимой 1000.

Если вы хотите удалить эти файлы, вы можете использовать это:

import os;i = 1
while 1:os.remove(`i`+'.py');i+=1
nedla2004
источник
0

RBX.Lua, 14 байтов

ЭТО ДАЖЕ ФИЛЬСИСТЕМА, Я НЕ ЗНАЮ

script:Clone()

Сам клонирует. По мере того, как он запускается, он снова запускается, что обеспечивает автоматическую рекурсию.

devRicher
источник
0

Python 2, 61 bytes (unix) 65 (cross-platform)

Unix - 61 bytes

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

On unix cp is the systems copy-file - command. Using the console via popen allows me to copy the file by cp. new files will spawn in old-files directory.

CrossPlatform - 65 bytes

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

This works, as open on default allows reading.

Funfact: replace 1:i+=1 with i:i-=1 and it will stop at i copies.

Other than that, I see no way of making it shorter than @muddyfish did it.

Teck-freak
источник
0

C, 80 bytes

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

Prints itself until you kill it. Just a standard C quine with an infinite loop.

MD XF
источник