2009-09-25 9 views
19

Penso che questa potrebbe essere una domanda classica ma non sono a conoscenza di una risposta. Un programma può emettere una copia di se stesso e, in tal caso, esiste un programma breve che lo fa?Un programma può emettere una copia di se stesso

Non accetto il "programma vuoto" come risposta e non accetto programmi che abbiano accesso al proprio codice sorgente. Piuttosto, sto pensando qualcosa di simile:

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

ma non so come continuare ...

+5

Ragnarius - Si potrebbe desiderare di leggere "Godel, Escher e Bach" di Douglas Hoffstader. Il suo libro descrive altre forme di algoritmi e la natura degli algoritmi che è simile al tuo interesse per le quine. Prenderò in considerazione questo testo di "informatica classica" che ha una relazione enorme con la tua domanda. –

+2

Prova questa ricerca: http://stackoverflow.com/search?q=quine – dmckee

risposta

14

L'idea di base della maggior parte dei quines è:

  1. di scrivere codice che prende una stringa letterale s e lo stampa, mentre le occorrenze sostituzione (o il occorrenza) di una stringa speciale foo in s del valore di s stesso.

  2. L'utente prende l'intero codice sorgente del programma fino a quel momento e lo utilizza come definizione per s. ma è escludere la definizione disdalla stringa, sostituendolo invece da pippo.

Bene, questa è l'idea generale. Il resto sono dettagli di formattazione delle stringhe, davvero.

5

Questo è chiamato un Quine: Una Quine

è un programma informatico che non accetta input e produce una copia del proprio codice sorgente come unica uscita. I termini standard per questi programmi nella teoria della computabilità e nella letteratura informatica sono programmi autoreplicanti, programmi autoriproducenti e programmi di auto-copiatura.

Un quine è un punto fisso di un ambiente di esecuzione, quando l'ambiente di esecuzione viene visualizzato come una funzione. Le quine sono possibili in qualsiasi linguaggio di programmazione completo di Turing, come conseguenza diretta del teorema di ricorsione di Kleene. Per divertimento, i programmatori a volte tentano di sviluppare il quine più breve possibile in ogni dato linguaggio di programmazione.

Fonte: Wikipedia

+0

Grazie mille !!/ragnarius – ragnarius

37

Si chiama quine, e c'è un sito that collects them.

+0

Grazie, studierò il tuo link! – ragnarius

+0

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

+0

come hai fatto * a * quello? – SamB

1

Se scrivi un quine, fai attenzione che le copie non scrivano anche copie di se stesse all'infinito e finiscano per conquistare il mondo.

+0

Questa è la differenza tra la scrittura di una copia e l'esecuzione. –

+0

Se le copie iniziano a riprodursi, dovranno essere eseguite. – Buggieboy

+2

Non è stato fino a questo momento che ho equiparato un quine con RNA. Dove sono i vaccini quine, chiedo! Salva te stesso, gente! –

1

Nel language invented by Jon Skeet il seguente operatore stampa "Salve, mondo! \ N".

h 

posso fare una modifica di questa lingua in modo che le seguenti stampe del programma "Ciao, mondo! \ N":

Hello, world! 

Ecco, questo è il programma che si stampa.

Oh, senti qualcosa di strano al riguardo, mentre ha una definizione matematica precisa e corretta? Questo è il tuo problema. "Non accetterò ..." ha! La matematica accetta e lei è l'amante che servo, quindi pubblico questa risposta.

+0

Questo è profondo. – Buggieboy

+2

Sì, e quando ci penso, potrei anche immaginare una lingua in cui l'operatore h emette effettivamente h. – ragnarius

+0

Questo, come usare solo 'H' per Hello World è già stato documentato in HQ9 +, in cui' Q' è un comando che stampa il codice sorgente del programma. Anche "9" stampa il testo di "99 bottiglie di birra su un muro" e "+" incrementa l'accumulatore. Per coincidenza, avevo un interprete HQ9 + completamente funzionale sulla mia calcolatrice grafica. :) – Joren

4

Questa è davvero una domanda classica!

Al di là dell'esistenza di specifiche quines, un risultato importante nella teoria della computabilità è che per qualsiasi funzione si potrebbe desiderare di calcolare, esiste un programma che "conosce un proprio testo del programma", cioè in grado di stampare in sé se lo si desidera . Questo teorema è chiamato Kleene's second recursion theorem.

1

Suppongo che tu permetta le lingue interpretate. (A un certo livello, tutte le lingue sono interpretate.) Qualcuno scrive l'interprete e, se lo stai scrivendo, puoi aggiungervi qualsiasi funzione incorporata che ti piace, come una (lispy) funzione (foo) che non fa altro che stampare " (foo) ".

Oppure è possibile aggiungere una funzione di tipo macro più complessa (printMeAndMyArgs ...).

Quindi il trucco sta nel modo in cui si definisce il problema.

0

"Introduzione alla teoria del calcolo" di Michael Sipser spiega in uno dei capitoli come costruire un quine. Di recente ho scritto un programma Java basato su tale idea e lo ho postato su: http://bornagainprogrammer.net/2009/11/07/hello-world-from-the-tm-self/

Ti suggerisco di procurarti quel libro e provare a implementare il programma nella tua lingua preferita. Ci sono molti altri teoremi divertenti in quel libro.

-kiran

0
// save it as file.cpp 

#include <iostream> 
#include <cstdlib> 

using namespace std; 

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

è possibile in Java, ma con alcuni vincoli

Ho scritto un semplice codice in Java che si stampa. È possibile utilizzare letterali di C/C++ per utilizzare lo stesso programma. Puoi aggiungere tutto ciò che vuoi all'interno di questo programma, si stamperà completamente.

Condizioni

  1. file di Java non dovrebbe essere all'interno di ogni pacchetto

  2. struttura delle cartelle non deve contenere cartelle con gli spazi nel suo nome

  3. obiettivo censimento dovrebbe essere di default o stessa cartella dove risiede il file java

import java.io.FileInputStream; importazione java.net.URL;

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

} 

}

Problemi correlati