Pergunta

Eu acho que isso pode ser uma questão clássica, mas eu não tenho conhecimento de uma resposta. Pode uma saída do programa uma cópia de si mesmo, e, se assim for, há um pequeno programa que faz isso?

Eu não aceitar o "programa de vazio" como resposta, e eu não aceitam programas que têm acesso a lá próprio código-fonte. Pelo contrário, estou pensando em algo como isto:

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

mas eu não sei como continuar ...

Foi útil?

Solução

Sim. Um programa que pode fazer uma cópia de si mesmo é chamado de "Quine".

A idéia básica da maioria dos quines é:

  1. Você escrever código que leva um s literal corda e imprime-lo, ao substituir ocorrências (ou o ocorrência) de uma substring especial foo em s pela valor da própria s.

  2. Você pega todo o código-fonte do programa até agora e usá-lo como a definição para s. mas você excluir a definição de s a partir da cadeia , em vez substituí-lo pelo foo .

Essa é a idéia geral. O resto é seqüência de formatação detalhes, realmente.

Outras dicas

É chamado um Quine , e há um site que recolhe-los .

Isto é chamado um Quine :

A Quine é um programa de computador que não tem entrada e produz uma cópia do seu próprio código-fonte como a sua única saída. Os termos padrão para esses programas na teoria da computabilidade e da literatura de ciência da computação são programas de auto-replicantes, programas de auto-reprodução, e programas de auto-copiar.

A Quine é um ponto fixo de um ambiente de execução, quando o ambiente de execução é visto como uma função. Quines são possíveis em qualquer linguagem de programação completa Turing, como consequência direta do teorema de recursão de Kleene. Para o entretenimento, os programadores, por vezes, tentar desenvolver o mais curto Quine possível em qualquer linguagem de programação.

Fonte: Wikipedia

Esta é certamente uma questão clássica!

Além da existência de específico quines , um resultado importante na teoria da computabilidade é que para a qualquer função que você pode querer calcular, existe um programa que "sabe seu próprio texto do programa", ou seja, que pode imprimir em si, se desejar. Este teorema é chamado segunda recursão de Kleene teorema .

Sim. Aqui está um programa C que faz isso que eu escrevi sobre há 20 anos.

http://womencht.reocities.com/Athens/8994/repeat.html

Se você escreve um Quine, ter cuidado para que as cópias não também cópias de escrita de si mesmos ad infinitum e acabam tomando conta do mundo.

Na linguagem inventado por Jon Skeet as seguintes impressões operador "Olá, mundo! \ n".

h

Eu posso fazer uma modificação desta linguagem para que o programa a seguir imprime "Olá, mundo! \ N":

Hello, world!

Então esse é o programa que imprime em si.

Oh, você sente algo estranho sobre isso, enquanto ele tem uma definição matemática precisa e correta? Esse é o seu problema. "Eu não vou aceitar ..." ha! Matemática não aceita, e ela é a dona sirvo, então eu postar esta resposta.

Eu suponho que você permitir que linguagens interpretadas. (Em algum nível, todos os idiomas são interpretados.) Alguém escreve o intérprete, e se você está escrevendo, você pode adicionar a ele qualquer built-in funções que você gosta, como um (lispy) (foo) função que não faz nada além de impressão " (foo)".

Ou você pode adicionar um mais complexo (printMeAndMyArgs ...) função macro-tipo.

Portanto, o truque está em como você definir o problema.

Michael Sipser de “Introdução à Teoria da Computação”, explica em um dos capítulos como construir um Quine. Eu tenho escrito recentemente um programa Java com base nessa ideia e postou em: http://bornagainprogrammer.net/2009/11/07/hello-world-from-the-tm-self/

Eu sugiro que você se apossar do livro e tentar implementar o programa-se na sua língua favorita. Há muitos outros teoremas diversão nesse livro.

-kiran

// save it as file.cpp

#include <iostream>
#include <cstdlib>

using namespace std;

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

É possível em Java, mas com algumas restrições.

Eu escrevi um simples código em java que se imprime. Você pode usar literais de C / C ++ para usar o mesmo programa. Você pode adicionar qualquer coisa que você quer dentro deste programa, ele irá imprimir-se completamente.

Condições

  1. arquivo Java não deve estar dentro de qualquer pacote

  2. Estrutura da pasta não deve conter todas as pastas com espaços em seu nome

  3. alvo de compilação deve ser padrão ou mesma pasta onde reside o arquivo Java

    import java.io.FileInputStream;
    import 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);
            }
    
        }
    }
    
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top