โคลนตัวเอง!


13

คุณต้องสร้างโปรแกรมที่สร้างโคลนที่แน่นอนของตัวเองอย่างไม่สิ้นสุดจนกว่าจะหยุด สิ่งที่อยู่ในโปรแกรมดั้งเดิมจะต้องอยู่ในโคลน กล่าวอีกนัยหนึ่งโคลนและโปรแกรมต้นฉบับเหมือนกันทุกประการยกเว้นว่าโคลนไม่จำเป็นต้องอยู่ในไฟล์ประเภทเดียวกันกับซอร์สโค้ด (ซึ่งอาจเป็นไฟล์ข้อความ)

ตัวอย่าง:

หากโปรแกรมดั้งเดิมของฉันคือ:

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

โคลนจะต้อง:

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

กฎและคำชี้แจง:

  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

  • โคลนต้องเป็นสำเนาที่แน่นอนของต้นฉบับ

  • โคลนต้องเป็นไฟล์ที่อ่านได้ซึ่งสามารถเรียกใช้ได้หากใส่ล่ามที่ถูกต้อง

  • โปรแกรมสามารถอ่านซอร์สโค้ดของตัวเอง

  • โคลนทั้งหมดจะต้องเป็นไฟล์แยกต่างหาก

  • ไม่อนุญาตให้พิมพ์โปรแกรมของคุณ

  • ชื่อไฟล์จะนับเป็นจำนวนไบต์

  • โคลนนิ่งไม่จำเป็นต้องอยู่ในไดเรกทอรีเดียวกันกับไฟล์ต้นฉบับหรือแชร์ชื่อไฟล์เดียวกัน

  • ควรสร้างอย่างน้อย 1,000 โคลน

ชนะ:

ไบต์ที่น้อยที่สุดชนะ!

คำตอบ:


3

Zsh , 19 17 9 ไบต์

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

สำหรับฉันทามติเกี่ยวกับเมตานั้น shebang จะไม่รวมอยู่ในจำนวนไบต์

ลองออนไลน์!

โปรดทราบว่าการป้องกัน forkbomb ของ TIO จะฆ่ากระบวนการหลังจากสร้างไฟล์ 113 ไฟล์ มันสามารถสร้างไฟล์ได้ 1,000 ไฟล์ในระบบโดยไม่มีข้อ จำกัด ด้านทรัพยากรแบบอนุรักษ์นิยม


ฉันชอบyes `<$0`|split -1มากขึ้น แต่มันเพิ่มจำนวนไบต์เป็นสองเท่า ...
Dennis

น่าเสียดายที่การเปลี่ยนเส้นทางเข้า - ออกแบบนี้ทำงานได้ไม่ดีในการทุบตี :( ชั่วครู่หนึ่งฉันคิดว่าจะทำให้คุณเสียโฉม :)
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

ทุบตี, 25, 16, 1211 ไบต์

การแก้ไข:

  • ลบ newline (-1 ไบต์) เพิ่ม "ลองออนไลน์" ขอบคุณ @Dennis!
  • ใช้ PID งานพื้นหลัง$!เป็นชื่อไฟล์ (จะถูกนำมาใช้ซ้ำทุกไฟล์ ~ 32k แต่ตอนนี้ได้รับอนุญาต) -4 ไบต์

แข็งแรงเล่นกอล์ฟ

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

อธิบาย

วางไข่ตัวเองใหม่เป็นงานพื้นหลังด้วย & ก่อนทำสำเนาดังนั้นการวนซ้ำแต่ละครั้งจะทำงานภายใต้ PID ของตัวเอง

ใช้ PID งานล่าสุดเป็นชื่อไฟล์

สิ่งนี้สามารถเรียกใช้ไม่ จำกัด (หรือจนกว่าจะหยุด) แต่จะใช้ชื่อไฟล์โคลนซ้ำอีกครั้ง ซ้ำทุก ~ 32k

อาจเป็นเรื่องน่ารังเกียจเล็กน้อยที่จะฆ่า แต่ AFAIK ไม่ได้ผิดกฎ

ลองออนไลน์!


คุณมีสถานที่ทดสอบที่ฉันสามารถลองด้วยตัวเองได้หรือไม่?
Anthony Pham

@PythonMaster ปกติแล้วฉันจะใช้ testbed ออนไลน์ของ Tutorial Point แต่ไม่ได้ติดตั้ง uuid และไม่ชอบสคริปต์ที่ใช้งาน IO มาก
Zeppelin

TIO ไม่มีปัญหากับ I / O นอกจากนี้คุณไม่จำเป็นต้องขึ้นบรรทัดใหม่หลังจาก&นั้น 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 นั้นไร้ประโยชน์เนื่องจากคุณมีเครื่องหมายปีกกา
Alexis Andersen

open ('a.rb',? r) แทนที่ File.read ('a.rb')
Alexis Andersen

? w เป็นตัวอักษร w สตริงในสิทธิของมันเอง ? w == 'w' ดังนั้นคุณไม่จำเป็นต้องใส่เครื่องหมายคำพูดใน "? w"
Alexis Andersen

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

ที่จริงแล้วคุณยังสามารถใช้เครื่องมือจัดฟันแบบโค้งสำหรับวิธีวนได้เช่นกัน
Alexis Andersen


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
คุณไม่จำเป็นต้อง namespace File.Copyเพื่อให้คุณอย่างเต็มที่สามารถมีคุณสมบัติ เปลี่ยนเป็นห่วงสำหรับเพื่อให้คุณสามารถอินไลน์ประกาศ int และถอดชิ้น1>0ส่วน และเพิ่มขึ้นiในFile.Copyคำสั่งที่ให้คุณ 86 bytes ฉันเชื่อว่า: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[]
);

"รหัสที่ซับซ้อน" กำลังยิ้ม
Roman Gräf


1

Python 2, 54 ไบต์

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

ไม่ทำคุณจะต้องimport sys?
ซามูเอลชิฟเตอร์โรวิช

@SamuelShifterovich ฉันจะมี ผมไม่แน่ใจว่าการที่จะแก้ไขรอดชีวิตเป็นไบต์นับฉันถูกใช้เป็นที่สำหรับโปรแกรมที่ปรากฏในขณะนี้
ฟ้า

1

Mathematica, 41 ไบต์

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

โปรแกรมเต็มรูปแบบ สำเนาของแหล่งที่มาของตัวเองลงในไฟล์0, 1, 2ฯลฯ ในไดเรกทอรีปัจจุบัน


1

PHP, 91 60 ไบต์

บันทึกแล้ว 31 ไบต์ขอบคุณ manatwork

<?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

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( +'.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 ไฟล์ แต่นั่นไม่ได้ใกล้เคียงกับ 1,000 ที่ต้องการ

หากคุณต้องการลบไฟล์เหล่านี้คุณสามารถใช้สิ่งนี้:

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 คือระบบคัดลอกไฟล์ - คำสั่ง การใช้คอนโซลผ่าน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และจะหยุดที่ i copy

นอกจากนั้นฉันไม่เห็นวิธีที่จะทำให้สั้นกว่า @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);}

พิมพ์ตัวเองจนกว่าคุณจะฆ่ามัน แค่ควินซีมาตรฐานที่มีวงวนไม่สิ้นสุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.