Nhân bản chính mình!


13

Bạn phải tạo một chương trình tạo bản sao chính xác của chính nó vô tận cho đến khi dừng lại. Bất cứ điều gì trong chương trình ban đầu phải ở trong bản sao. Nói cách khác, các bản sao và chương trình gốc giống nhau về mọi mặt ngoại trừ việc các bản sao không phải ở cùng loại tệp với mã nguồn (chúng có thể là tệp văn bản).

Thí dụ:

Nếu chương trình ban đầu của tôi là:

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

bản sao cũng phải là:

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

Các quy tắc và làm rõ:

  • Sơ hở tiêu chuẩn bị cấm

  • Bản sao phải là bản sao chính xác của bản gốc

  • Các bản sao phải là các tệp có thể đọc được nếu có thể được đặt bên trong trình thông dịch chính xác

  • Chương trình có thể đọc mã nguồn riêng của nó

  • Tất cả các bản sao phải là các tệp riêng biệt

  • In chương trình của bạn ra là không được phép

  • Tên tệp được tính vào số byte

  • Các bản sao không phải ở cùng thư mục với tệp nguồn cũng như không chia sẻ cùng tên tệp

  • Ít nhất 1000 bản sao có thể được tạo

Chiến thắng:

Ít nhất là chiến thắng byte!

Câu trả lời:


3

Zsh , 19 17 9 byte

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

Theo sự đồng thuận về meta , shebang được loại trừ khỏi số byte.

Hãy thử trực tuyến!

Lưu ý rằng bảo vệ forkbomb của TIO sẽ giết quá trình sau khi 113 tệp được tạo. Nó có thể dễ dàng tạo 1000 tệp trên một hệ thống mà không có giới hạn tài nguyên bảo thủ như vậy.


Tôi thích yes `<$0`|split -1tốt hơn rất nhiều, nhưng điều đó làm tăng gấp đôi số byte ...
Dennis

Quá tệ khi chuyển hướng ra ngoài như thế không hoạt động tốt trong bash :( Trong một khoảnh khắc, tôi ngây thơ nghĩ rằng đã vượt qua bạn :)
zeppelin

4

Mẻ, 32 byte

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

Không sử dụng @vì không có hạn chế về STDOUT. %1mặc định cho chuỗi trống, do đó ntrở thành 1lần đầu tiên và tăng trên mỗi lần vượt qua. Ngoài ra, điều này có thể hoạt động trong 28 byte, nhưng tôi không biết %random%thực sự ngẫu nhiên như thế nào khi được sử dụng như thế này:

copy %0 %random%%random%
%0

2
IIRC %random%dựa trên thời gian hiện tại và có thể tạo ra bất cứ thứ gì từ 0 đến một cái gì đó hơi cao hơn 32.000.
dùng2428118

Để làm rõ, %random%là một biến mà khi được truy cập sẽ mang lại một số ngẫu nhiên như @ user2428118 đã đề cập.
Conor O'Brien

3

Bash, 25, 16, 12, 11 byte

CHỈNH SỬA:

  • Đã xóa dòng mới (-1 byte), Đã thêm "Dùng thử trực tuyến". Cảm ơn @Dennis!
  • Sử dụng công việc nền PID $!làm tên tệp (sẽ được sử dụng lại sau mỗi ~ 32k tệp, nhưng hiện đã được phép), -4 byte

Chơi gôn

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

Giải thích

Tái sinh ra chính nó như là một công việc nền với &, trước khi thực hiện một bản sao, vì vậy mỗi lần lặp sẽ chạy theo PID riêng của nó.

Sử dụng công việc cuối cùng PID làm tên tệp.

Điều này có thể chạy vô hạn (hoặc cho đến khi dừng lại) nhưng sẽ sử dụng lại tên tệp nhân bản xấp xỉ. mỗi lần lặp ~ 32k.

Có thể hơi khó chịu để giết, nhưng AFAIK không trái với quy tắc.

Dùng thử trực tuyến!


Bạn có một nơi thử nghiệm mà tôi có thể tự mình thử nó không?
Anthony Phạm

@PythonMaster, thông thường tôi sẽ sử dụng thử nghiệm trực tuyến của Tutorial Point, nhưng nó không được cài đặt uuid và không thích tập lệnh thực hiện quá nhiều IO.
zeppelin

TIO không có vấn đề với I / O. Ngoài ra, bạn không cần dòng mới sau &. tio.run/nexus/bash#VY5BS8NAEIXP7q943W5tq6QpelMRRCIIGg/...
Dennis

3

Ruby, 78 byte , 77 43 + 4 (tên tệp: a.rb) = 47 byte

  • Phiên bản 1.2

43 byte + tên / Cảm ơn @Alexis Rất ngắn hơn nhiều !!!

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

đó là về việc chơi golf như tôi nghĩ nó sẽ nhận được

  • Phiên bản 1.1

73 byte + tên / Cảm ơn @Alexis Anderson

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

74 byte + tên

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

Đây là câu trả lời Ruby đầu tiên của tôi vì vậy tất cả các sản phẩm đều được chào đón.


kernel mở về phía trước để mở tập tin, bạn sẽ có thể bỏ qua File. hoàn toàn. ? w thay cho "w". Tôi nghĩ rằng việc làm trên File.open là vô ích, vì bạn có các dấu ngoặc nhọn.
Alexis Andersen

mở ('a.rb' ,? r) thay cho File.read ('a.rb')
Alexis Andersen

? w là một nhân vật w. Một chuỗi trong quyền riêng của nó. ? w == 'w'. vì vậy bạn không cần các trích dẫn trong "? w"
Alexis Andersen

i = 0 lặp làm File.write "# {i}", mở ("a.rb" ,? r) i + = 1 kết thúc
Alexis Andersen

trên thực tế, bạn cũng có thể sử dụng dấu ngoặc nhọn cho phương pháp vòng lặp
Alexis Andersen


2

C #, 104 102 byte

-2 byte nhờ berjonbross

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

Không, nó không phải là ngắn nhất. Nhưng đó là C #. Những gì bạn đã mong đợi?


1
Bạn không cần một không gian tên để bạn có thể đủ điều kiện File.Copy. Thay đổi thành một vòng lặp for để bạn có thể nội tuyến khai báo int và loại bỏ 1>0phần đó. Và trước khi tăng itrong File.Copycâu lệnh, nó cung cấp cho bạn 86 byte tôi tin rằng:class P{static void Main(){for(int i=0;;)System.IO.File.Copy("c.cs","c"+ ++i+".cs");}}
TheLethalCoder

Trên thực tế, điều này sẽ không hoạt động vì c.cssẽ không có trong thư mục đầu ra và phải được sao chép thủ công. Cái này hoạt động ra sao?
TheLethalCoder

Đừng quên nội suy chuỗi $"c{++i}.cs"ngắn hơn 2 byte so với"c"+ ++i+".cs"
ber ở giữa

1

Đang xử lý, 55 + 5 (tên tệp) = 60 byte

Tôi không biết nếu tên tệp được tính là byte bổ sung

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

Gần như một loạt các nội dung được kết nối lại với nhau

Giải trình

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

"Mã phức tạp" đó đang mỉm cười
Roman Gräf

1

ForceLang + mô-đun 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

Bạn không phải import syssao?
Samuel Shifterovich

@SamuelShifterovich tôi sẽ có. Tôi không chắc cách chỉnh sửa đó tồn tại như số byte tôi đang sử dụng cho chương trình hiện được hiển thị
Blue

1

Toán học, 41 byte

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

Chương trình đầy đủ. Bản sao của tập tin nguồn vào của nó 0, 1, 2, vv trong thư mục hiện hành.


1

PHP, 91 60 byte

Đã lưu 31 byte nhờ thao tác

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

Cách sử dụng: $ php f.phpnhái f.phpvà mã của nó tái tạo vô hạn bản thân trong tên tập tin như 1, 2, 3... cho đến khi thời gian chờ.

Phiên bản trước:

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

Cách sử dụng: $ php f.phpnhái f.phpvà tái tạo mã của nó vô cùng thân thích f1.php, f2.php, f3.php... f(n).phpcho đến khi thời gian chờ.


Vì tên tệp clone có thể là bất cứ thứ gì, tại sao không sử dụng chỉ các số mà không cần gia hạn? <?for(;;)file_put_contents(++$i,file_get_contents("f.php"));
manatwork

0

awk, 29 (21) byte,

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

awk không thực sự là công cụ cho việc này vì nó yêu cầu close() khi chạy vô thời hạn. Nếu không, tất cả những gì nó tạo ra là các tập tin trống.

Nếu số lượng bản sao có giới hạn, ví dụ 5:

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

chương trình sẽ là 21 byte.

Dán chương trình vào một tệp avà chạy:

$ awk -f a a

0

Python, 69 byte

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

Tôi đã thử sử dụng atên tệp, nhưng (không ngạc nhiên) Windows không thích các tệp có tên a=open(__file__).read()\ni=0\nwhile 1:i+=1;open(i+'.py','w').write(a) . Tôi cũng đã thử điều này:

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

Tuy nhiên, nó mang lại cho tôi lỗi này:

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'

Nó tạo ra 83 tệp, nhưng nó thậm chí không gần với 1000 cần thiết.

Nếu bạn muốn xóa các tệp này, bạn có thể sử dụng tệp này:

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

0

RBX.Lua, 14 byte

ĐÂY LÀ NGAY LẬP TỨC TUYỆT VỜI TÔI KHÔNG BIẾT

script:Clone()

Bản sao chính nó. Khi nó được kích hoạt, chạy lại, do đó cung cấp đệ quy tự động.



0

Python 2, 61 byte (unix) 65 (đa nền tảng)

Unix - 61 byte

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

Trên cp unix là tập tin sao chép hệ thống - lệnh. Sử dụng bảng điều khiển qua popen cho phép tôi sao chép tệp bằng cp. tập tin mới sẽ sinh ra trong thư mục tập tin cũ.

CrossPl Platform - 65 byte

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

Điều này hoạt động, như mở trên mặc định cho phép đọc.

Funfact: thay thế 1:i+=1bằngi:i-=1 và nó sẽ dừng lại ở i bản sao.

Ngoài ra, tôi thấy không có cách nào làm cho nó ngắn hơn @muddyfish đã làm điều đó.


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

In cho đến khi bạn giết nó. Chỉ cần một quine C tiêu chuẩn với một vòng lặp vô hạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.