2009-09-25 29 views
19

मुझे लगता है कि यह एक क्लासिक सवाल हो सकता है लेकिन मुझे किसी उत्तर के बारे में पता नहीं है। क्या कोई प्रोग्राम स्वयं की एक प्रति आउटपुट कर सकता है, और यदि हां, तो क्या कोई छोटा प्रोग्राम है जो यह करता है?क्या कोई प्रोग्राम स्वयं की प्रतिलिपि बना सकता है

मैं "खाली प्रोग्राम" को उत्तर के रूप में स्वीकार नहीं करता हूं, और मैं ऐसे प्रोग्राम स्वीकार नहीं करता जिनके पास अपने स्रोत कोड तक पहुंच है। बल्कि, मैं कुछ इस तरह सोच रहा हूँ:

int main(int argc, char** argv){ printf("int main(argc, char** argv){ printf... 

लेकिन मैं जारी रखने के लिए पता नहीं कैसे ...

+5

Ragnarius - आप "गोडेल, Escher और बाख" डगलस Hoffstader करके भी पढ़ सकते हैं। उनकी पुस्तक एल्गोरिदम के अन्य रूपों और एल्गोरिदम की प्रकृति का वर्णन करती है जो कि क्विन्स में आपकी रूचि के समान है। मैं इस "क्लासिक" कंप्यूटर साइंस टेक्स्ट पर विचार करूंगा जिसका आपके प्रश्न का बड़ा रिश्ता है। –

+2

इस खोज को आजमाएं: http://stackoverflow.com/search?q=quine – dmckee

उत्तर

14

सबसे quines के मूल विचार है:

  1. आप कोड है कि एक स्ट्रिंग शाब्दिक s और प्रिंट लेता लिखना यह है, जबकि जगह घटनाओं (या घटना) एक विशेष सबस्ट्रिंग foo में की ss के मूल्य से ही।

  2. आप अब तक प्रोग्राम का पूरा स्रोत कोड लेते हैं और इसे s के लिए परिभाषा के रूप में उपयोग करते हैं। लेकिन आप स्ट्रिंग सेsकी परिभाषा को बाहर , बजाय foo द्वारा जगह।

अच्छा, यह सामान्य विचार है। बाकी वास्तव में स्ट्रिंग स्वरूपण विवरण है।

5

यह एक Quine कहा जाता है:

एक Quine एक कंप्यूटर प्रोग्राम है जो कोई इनपुट नहीं लेता है और अपने स्वयं के स्रोत कोड की एक प्रति अपने आउटपुट के रूप में बनाता है। कम्प्यूटेबिलिटी थ्योरी और कंप्यूटर साइंस साहित्य में इन कार्यक्रमों के लिए मानक शब्द आत्म-प्रतिकृति कार्यक्रम, स्वयं-पुनरुत्पादन कार्यक्रम और स्वयं-प्रतिलिपि कार्यक्रम हैं।

एक क्विन एक निष्पादन वातावरण का एक निश्चित बिंदु है, जब निष्पादन वातावरण को फ़ंक्शन के रूप में देखा जाता है। क्लेन के रिकर्सन प्रमेय के प्रत्यक्ष परिणाम के रूप में, किसी भी ट्यूरिंग पूर्ण प्रोग्रामिंग भाषा में क्विन्स संभव है। मनोरंजन के लिए, प्रोग्रामर कभी-कभी किसी भी प्रोग्रामिंग भाषा में सबसे कम संभव क्विन विकसित करने का प्रयास करते हैं।

स्रोत: विकिपीडिया

+0

बहुत बहुत धन्यवाद !!/रैग्नियस – ragnarius

37

यह एक quine कहा जाता है, और वहाँ एक साइट that collects them है।

+0

धन्यवाद, मैं आपके लिंक का अध्ययन करूंगा! – ragnarius

+0

['test'] (http://example.com) –

+0

आपने यह कैसे किया *? – SamB

1

यदि आप एक क्विन लिखते हैं, तो सावधान रहें कि प्रतियां स्वयं को इन्फिनिटम की प्रतियां नहीं लिखती हैं और दुनिया को खत्म कर देती हैं।

+0

यह एक प्रतिलिपि लिखने और इसे निष्पादित करने के बीच अंतर है। –

+0

यदि प्रतियां खुद को पुन: उत्पन्न करना शुरू करती हैं, तो उन्हें निष्पादित करना होगा। – Buggieboy

+2

यह इस क्षण तक नहीं था कि मैंने आरएनए के साथ एक क्विन को समझाया। क्विन टीके कहां हैं, मैं पूछता हूं! खुद को बचाओ, लोग! –

1

language invented by Jon Skeet में निम्न ऑपरेटर प्रिंट करता है "हैलो, दुनिया! \ N"।

Hello, world! 

ताकि प्रोग्राम है जो अपने आप में प्रिंट है:

h 

मैं इतना है कि निम्नलिखित कार्यक्रम प्रिंट "! हैलो, दुनिया \ n" इस भाषा का एक संशोधन कर सकते हैं।

ओह, आप इसके बारे में कुछ अजीब महसूस करते हैं, जबकि इसकी सटीक और सही गणितीय परिभाषा है? यह तुम्हारी समस्या है। "मैं स्वीकार नहीं करूंगा ..." हे! गणित स्वीकार करता है, और वह मालकिन है जो मैं सेवा करता हूं, इसलिए मैं यह जवाब पोस्ट करता हूं।

+0

यह गहरा है। – Buggieboy

+2

हां, और जब मैं इसके बारे में सोचता हूं तो मैं एक ऐसी भाषा की कल्पना भी कर सकता हूं जहां ऑपरेटर एच वास्तव में एच आउटपुट करता है। – ragnarius

+0

यह, हैलो वर्ल्ड के लिए केवल 'एच' का उपयोग करने की तरह ही पहले से ही HQ9 + में प्रलेखित किया गया है, जिसमें' क्यू 'एक ऐसा आदेश है जो प्रोग्राम के स्रोत कोड को प्रिंट करता है। इसके अलावा '9' दीवार पर '99 बोतलों की बियर' के गीतों को प्रिंट करता है और '+' संचयक को बढ़ाता है। संयोग से मैं अपने ग्राफिंग कैलक्यूलेटर पर एक पूर्ण कार्यात्मक मुख्यालय + दुभाषिया का उपयोग करता था। :) – Joren

4

यह वास्तव में एक क्लासिक सवाल है!

विशिष्ट quines, कम्प्यूटेबिलिटी सिद्धांत में एक महत्वपूर्ण परिणाम के अस्तित्व से परे है कि के लिए किसी भी समारोह आप गणना करने के लिए चाहते हो सकता है, वहाँ एक प्रोग्राम है जो कि अपने आप में प्रिंट कर सकता है अगर वांछित, यानी "अपने स्वयं कार्यक्रम पाठ जानता है" मौजूद है । इस प्रमेय को Kleene's second recursion theorem कहा जाता है।

1

मुझे लगता है कि आप व्याख्या की गई भाषाओं की अनुमति देते हैं। (कुछ स्तर पर, सभी भाषाओं का अर्थ है।) कोई व्यक्ति दुभाषिया लिखता है, और यदि आप इसे लिख रहे हैं, तो आप इसे किसी भी अंतर्निहित कार्यों में जोड़ सकते हैं, जैसे कि (lispy) फ़ंक्शन (foo) जो प्रिंट को छोड़कर कुछ भी नहीं करता है " (foo) "।

या आप एक अधिक जटिल मैक्रो-प्रकार फ़ंक्शन (printMeAndMyArgs ...) जोड़ सकते हैं।

तो चाल यह है कि आप समस्या को कैसे परिभाषित करते हैं।

0

माइकल सिप्सर का "गणना की सिद्धांत का परिचय" अध्यायों में से एक में क्विन बनाने के लिए बताता है। मैंने हाल ही में उस विचार के आधार पर एक जावा प्रोग्राम लिखा है और इसे पोस्ट किया है: http://bornagainprogrammer.net/2009/11/07/hello-world-from-the-tm-self/

मुझे सुझाव है कि आप उस पुस्तक को पकड़ लें और प्रोग्राम को अपनी पसंदीदा भाषा में लागू करने का प्रयास करें। उस पुस्तक में कई अन्य मजेदार प्रमेय हैं।

-किर्कन

0
// save it as file.cpp 

#include <iostream> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
    system("cat file.cpp"); 
    return 0; 
} 
0

यह जावा में संभव है, लेकिन कुछ कमी

मैं जो अपने आप प्रिंट जावा में एक सरल कोड लिखा है के साथ। आप एक ही प्रोग्राम का उपयोग करने के लिए सी/सी ++ के अक्षर का उपयोग कर सकते हैं। आप इस कार्यक्रम के अंदर जो कुछ भी चाहते हैं उसे जोड़ सकते हैं, यह खुद को पूरी तरह मुद्रित करेगा।

स्थितियां

  1. जावा फ़ाइल किसी भी पैकेज के अंदर नहीं होना चाहिए

  2. फ़ोल्डर संरचना अपने नाम में रिक्त स्थान के साथ किसी भी फ़ोल्डर्स शामिल नहीं होना चाहिए

  3. संकलन लक्ष्य डिफ़ॉल्ट या एक ही फ़ोल्डर होना चाहिए जहां जावा फ़ाइल

रहता है

आयात java.io.FileInputStream; आयात java.net।यूआरएल;

सार्वजनिक वर्ग PrintYourself {

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    URL location = PrintYourself.class.getProtectionDomain().getCodeSource().getLocation(); 
    String path=location.getFile(); 
    path=path.replace("/bin", "/src"); 
    System.out.println(path); 

    try{ 
     FileInputStream st=new FileInputStream(path+"PrintYourself.java"); 
     int i=0; 
     while((i=st.read())!=-1){ 
      System.out.print((char)i); 
     } 
     st.close(); 
    } 
    catch(Exception e){ 
     System.out.println(e); 
    } 

} 

}

संबंधित मुद्दे

 संबंधित मुद्दे