Клонуйте себе!


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

За консенсусом щодо мета , шебанг виключається з підрахунку байтів.

Спробуйте в Інтернеті!

Зауважте, що захист від forkbomb TIO знищить процес після генерування 113 файлів. Він може легко генерувати 1000 файлів у системі без таких консервативних обмежень ресурсів.


Мені подобається yes `<$0`|split -1набагато краще, але це подвоює кількість байтів ...
Денніс

Шкода, що перенаправлення на виїзді не так добре працює в баш :( На одну мить я наївно подумав, що перевершив тебе :)
zeppelin

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.
Conor O'Brien

3

Bash, 25, 16, 12, 11 байт

ЗМІНИ:

  • Видалено новий рядок (-1 байт), додано "Спробуйте в Інтернеті". Дякую @Dennis!
  • Використовуйте фоновий PID завдання $!як ім'я файлу (буде використовуватися повторно кожні ~ 32k файли, але це тепер дозволено), -4 байти

Гольф

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

Пояснив

Повторно породжує себе як фонове завдання з &, перш ніж робити копію, тому кожна ітерація буде працювати під власним PID.

В якості імені файлу використовується останній PID завдання.

Це може працювати нескінченно (або до припинення), але буде повторно використовувати імена файлів клонів, приблизно. кожні ~ 32 к ітерації.

Вбивство може бути трохи неприємним, але AFAIK не проти правил.

Спробуйте в Інтернеті!


Чи є у вас місце для тестування, де я можу спробувати це на собі?
Ентоні Фам

@PythonMaster, я зазвичай використовую онлайн-тестовий блок "Tutorial Point", але він не встановлений uuid і не любить, щоб сценарій робив стільки IO.
zeppelin

У TIO немає проблем з введенням / виведенням. Крім того, після цього вам не потрібен новий рядок &. tio.run/nexus/bash#VY5BS8NAEIXP7q943W5tq6QpelMRRCIIGg/…
Dennis

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

Це моя перша відповідь Рубі, тому всі уточнення вітаються.


ядро відкрите вперед, щоб відкрити файл, ви повинні мати можливість опустити файл. взагалі. ? w замість "w". Я думаю, що робити на File.open марно, оскільки у вас фігурні дужки.
Алексіс Андерсен

відкрити ('a.rb',? r) замість File.read ('a.rb')
Алексіс Андерсен

? w - символ w. Рядок в ньому власний. ? w == 'w'. тож вам не потрібні цитати в "? w"
Алексіс Андерсен

i = 0 loop do File.write "# {i}", відкрити ("a.rb",? r) i + = 1 кінець
Алексіс Андерсен

власне, ви також можете використовувати фігурні дужки для методу циклу
Алексіс Андерсен


2

C #, 104 102 байти

-2 байти завдяки berkeleybross

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

Той "складний код" посміхається
Роман Граф


1

Python 2, 54 байти

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

Чи не треба import sys?
Самуїл Шифтерович

@SamuelShifterovich я б мав. Я не впевнений, як витримали цю редакцію, оскільки кількість байтів, яку я використовував, була для програми, яка зараз показана
Blue

1

Математика, 41 байт

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

Повна програма. Копії його власний вихідний файл в 0, 1, 2і т.д. в поточному каталозі.


1

PHP, 91 60 байт

Збережено 31 байт завдяки маневреній роботі

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

Використання: $ php f.phpклони f.phpі його код відтворення нескінченно себе в іменах файлів , як 1, 2, 3... до тайм - ауту.

Попередня версія:

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

Використання: $ php f.phpклони f.phpі його код відтворює нескінченно самі не хотіли f1.php, f2.php, f3.php... f(n).phpдо тих пір , тайм - ауту.


Оскільки файл клонування може бути будь-яким, чому б не використовувати просто числа без розширення? <?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

Пітон, 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

0

RBX.Lua, 14 байт

ЦЕ ВІД ФІЛІСИСТЕМА Я НЕ ЗНАЮ

script:Clone()

Клонує себе. По мірі того, як він буде інстальований, він запускається знову, тому забезпечує автоматичну рекурсію.



0

Python 2, 61 байт (unix) 65 (крос-платформа)

Unix - 61 байт

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

На unix cp - це система copy-file - команда. Використання консолі через popen дозволяє мені скопіювати файл cp. нові файли будуть породжені в каталозі старих файлів.

CrossPlatform - 65 байт

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

Це працює, оскільки відкриття за замовчуванням дозволяє читати.

Funfact: замінити 1:i+=1з , i:i-=1і він не зупиниться я екземпляри.

Крім цього, я не бачу способу зробити його коротшим, ніж це зробив @muddyfish.


0

C, 80 байт

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

Друкує себе, поки не вб'єш. Просто стандартна C quine з нескінченною петлею.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.