अपने आप को क्लोन!


13

आपको एक ऐसा प्रोग्राम बनाना है जो रुकने तक अपने आप में सटीक क्लोन बनाता है। मूल कार्यक्रम में जो कुछ भी है वह क्लोन में होना चाहिए। दूसरे शब्दों में, क्लोन और मूल कार्यक्रम हर तरह से एक ही हैं सिवाय इसके कि क्लोन को उसी तरह की फाइल में न होना चाहिए जैसा स्रोत कोड (वे पाठ फाइलें हो सकती हैं)।

उदाहरण:

यदि मेरा मूल कार्यक्रम है:

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

क्लोन भी होना चाहिए:

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

नियम और स्पष्टीकरण:

  • मानक खामियों को मना किया जाता है

  • क्लोन मूल की सटीक प्रतिलिपि होनी चाहिए

  • क्लोन पठनीय फ़ाइलें होनी चाहिए जिन्हें सही इंटरप्रेटर के अंदर डाला जा सकता है

  • कार्यक्रम अपने स्वयं के स्रोत कोड पढ़ सकता है

  • सभी क्लोन अलग-अलग फाइल होने चाहिए

  • अपने प्रोग्राम को प्रिंट करने की अनुमति नहीं है

  • फ़ाइल नाम बाइट्स की संख्या में गिना जाता है

  • क्लोनों को स्रोत फ़ाइल के समान निर्देशिका में होने की आवश्यकता नहीं है और न ही समान फ़ाइल नाम को साझा करें

  • कम से कम 1000 क्लोन बनाने में सक्षम होना चाहिए

जीतना:

कम से कम बाइट्स जीतता है!

जवाबों:


3

Zsh , 19 17 9 बाइट्स

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

मेटा पर सहमति के अनुसार , शबंग को बाइट काउंट से बाहर रखा गया है।

इसे ऑनलाइन आज़माएं!

ध्यान दें कि 113 फ़ाइलों के उत्पन्न होने के बाद TIO की forkbomb सुरक्षा प्रक्रिया को मार देगी। यह इस तरह के रूढ़िवादी संसाधन सीमाओं के बिना सिस्टम पर 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 20

स्पष्ट करने के लिए, %random%एक चर है, जिसे एक्सेस करते समय, @ user2428118 के रूप में एक यादृच्छिक संख्या प्राप्त होती है।
कॉनर ओ'ब्रायन

3

दे घुमा के, 25, 16, 12, 11 बाइट्स

संपादन:

  • नई लाइन (-1 बाइट) को हटा दिया गया, "इसे ऑनलाइन आज़माएं"। धन्यवाद @ डेनिस!
  • $!फ़ाइल नाम के रूप में पृष्ठभूमि नौकरी पीआईडी ​​का उपयोग करें (हर ~ 32k फ़ाइलों का पुन: उपयोग किया जाएगा, लेकिन अब इसकी अनुमति है), -4 बाइट्स

golfed

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

व्याख्या की

कॉपी करने से पहले, अपने आप को बैकग्राउंड जॉब के साथ & के रूप में फिर से बनाता है, इसलिए प्रत्येक पुनरावृत्ति अपने पीआईडी ​​के तहत चलेगी।

फ़ाइल नाम के रूप में अंतिम कार्य PID का उपयोग करता है।

यह असीम रूप से (या बंद होने तक) चल सकता है, लेकिन क्लोन फाइलनाम का पुन: उपयोग कर रहा होगा। हर ~ 32 k पुनरावृत्तियों।

मारने के लिए थोड़ा बुरा हो सकता है, लेकिन AFAIK नियमों के खिलाफ नहीं है।

यह ऑनलाइन की कोशिश करो!


क्या आपके पास एक परीक्षण स्थान है जहां मैं अपने लिए यह कोशिश कर सकता हूं?
एंथनी फाम

@PythonMaster, मैं आमतौर पर ट्यूटोरियल पॉइंट के ऑनलाइन टेस्ट किए गए का उपयोग करूंगा, लेकिन इसमें uuid इंस्टॉल नहीं है, और स्क्रिप्ट को इतना IO करना पसंद नहीं है।
ज़ेपेलिन

TIO को I / O से कोई समस्या नहीं है। इसके अलावा, आप के बाद newline की जरूरत नहीं है &tio.run/nexus/bash#VY5BS8NAEIXP7q943W5tq6QpelMRRCIIGg/…
डेनिस

3

रूबी, 78 बाइट्स , 77 43 + 4 (फ़ाइल नाम: a.rb) = 47 बाइट्स

  • संस्करण 1.2

43 बाइट्स + नाम / धन्यवाद @Alexis इतना छोटा !!!

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

के बारे में है कि मुझे लगता है कि यह होने वाला है

  • संस्करण 1.1

73 बाइट्स + नाम / धन्यवाद @Alexis एंडरसन के लिए

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

यह मेरा पहला रूबी जवाब है, इसलिए सभी inprovements का स्वागत है।


कर्नेल ओपन फॉरवर्ड टू ओपन, आपको फाइल को छोड़ना चाहिए। कुल मिलाकर। ? "w" के स्थान पर? मुझे लगता है कि File.open पर करना बेकार है, क्योंकि आपके पास घुंघराले ब्रेसिज़ हैं।
एलेक्सिस एंडरसन

File.read ('a.rb') के स्थान पर '(a.rb'; r ') खोलें
एलेक्सिस एंडरसन 20

? एक चरित्र w है। इसमें एक स्ट्रिंग अपने आप में सही है। ? डब्ल्यू == 'डब्ल्यू'। तो आपको "w?" में उद्धरण की आवश्यकता नहीं है
एलेक्सिस एंडरसन 20

i = 0 लूप डू File.write "# {i}", ओपन ("a.rb"; r) i + = 1 छोर
एलेक्सिस एंडरसन

वास्तव में, आप लूप विधि के लिए भी घुंघराले ब्रेसिज़ का उपयोग कर सकते हैं
एलेक्सिस एंडरसन


2

सी #, 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। एक लूप के लिए बदलना ताकि आप अंतर घोषणा को इनलाइन कर सकें और 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"
बर्कलेब्रोस

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

पायथन 2, 54 बाइट्स

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

आपके पास नहीं है import sys?
सैमुअल शिफ्टरोविच

@SamuelShifterovich मेरे पास होता। मुझे यकीन नहीं है कि मैं जिस बाइट की गिनती का उपयोग कर रहा था, वह कैसे बची थी, अब जो कार्यक्रम दिखाया गया था उसके लिए
ब्लू

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और उसके कोड reproducing असीम ही तरह f1.php, f2.php, f3.php... f(n).phpटाइमआउट तक।


जैसा कि क्लोन फ़ाइल नाम कुछ भी हो सकता है, बिना एक्सटेंशन के सिर्फ संख्याओं का उपयोग क्यों करें? <?for(;;)file_put_contents(++$i,file_get_contents("f.php"));
manatwork

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फ़ाइल नाम के लिए उपयोग करने की कोशिश की , लेकिन (अस्वाभाविक रूप से) विंडोज को 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

आरबीएक्स.लुआ, 14 बाइट्स

यह एक ऐसी फिल्म है जिसे मैं नहीं जानता

script:Clone()

क्लोन ही। जैसा कि यह कहा जाता है, फिर से चलाता है, इसलिए स्वचालित पुनरावृत्ति प्रदान करता है।



0

पायथन 2, 61 बाइट्स (यूनिक्स) 65 (क्रॉस-प्लेटफॉर्म)

यूनिक्स - 61 बाइट्स

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

यूनिक्स cp पर सिस्टम कॉपी-फाइल - कमांड है। पॉपेन के माध्यम से कंसोल का उपयोग करके मुझे फ़ाइल को cp द्वारा कॉपी करने की अनुमति मिलती है। नई फाइलें पुरानी-फाइलों की निर्देशिका में दिखाई देंगी।

CrossPlatform - 65 बाइट्स

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

यह काम करता है, जैसा कि डिफ़ॉल्ट पर खुला पढ़ने की अनुमति देता है।

फनफैक्ट: के1:i+=1 साथ बदलें i:i-=1और यह i प्रतियों में बंद हो जाएगा।

इसके अलावा, मुझे @muddyfish की तुलना में इसे छोटा बनाने का कोई तरीका नहीं दिख रहा है।


0

सी, 80 बाइट्स

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

जब तक आप इसे नहीं मारते तब तक खुद को प्रिंट करता है। अनंत लूप के साथ एक मानक सी क्वीन।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.