Quais são quines? Qualquer finalidade específica para tê-los? [fechadas]

StackOverflow https://stackoverflow.com/questions/1111869

  •  12-09-2019
  •  | 
  •  

Pergunta

me deparei com este termo - Quine (também chamado de auto-reproduzir programas). Só queria saber mais sobre ele. Como é que alguém escrever uma Quine e eles são usados ??em qualquer lugar ou eles são apenas um exercício para se divertir?

Eu comecei com o Python, e eu poderia tentar escrever um em Python. Alguma sugestão?

Foi útil?

Solução

Quines são inúteis em um sentido prático, mas eles são um ótimo exercício para ajudá-lo a aprender mais sobre a linguagem.

Aqui está uma forma muito concisa em python:

a='a=%r;print a%%a';print a%a

Outras dicas

No mínimo, quines são programas que produzem sua própria fonte como sua saída. Eles são um passo necessário na construção de uma prova de Gödel em incompletude.

Se isto constitui um uso prático é algo que eu não oferecem nenhum comentário sobre.

A Quine é um programa de computador que produz uma cópia do seu próprio código-fonte como a sua única saída.

Eu ainda tenho que ver um uso prático para um, mas eu tenho certeza que há um lá fora em algum lugar.


Python Exemplo ( encontrada aqui )

print (lambda s:s+`s`+')')("print (lambda s:s+`s`+')')(")

C Exemplo ( encontrada aqui

#include <stdio.h>

int main(int argc, char** argv)
{
/* This macro B will expand to its argument, followed by a printf
 command that prints the macro invocation as a literal string */
#define B(x) x; printf("  B(" #x ")\n");

/* This macro A will expand to a printf command that prints the
 macro invocation, followed by the macro argument itself. */
#define A(x) printf("  A(" #x ")\n"); x;

/* Now we call B on the text of the program
 up to this point. It will execute the command, and then cause
 itself to be printed. */
  B(printf("#include <stdio.h>\n\nint main(int argc, char** argv)\n{\n/*
    This macro B will expand to its argument, followed by a printf\n
    command that prints the macro invocation as a literal string
    */\n#define B(x) x; printf(\"  B(\" #x \")\\n\");\n\n/* This macro
    A will expand to a printf command that prints the\n
    macro invocation, followed by the macro argument itself. */\n#define A(x)
    printf(\"  A(\" #x \")\\n\"); x;\n\n/* Now we call B on the text
    of the program\n up to this point. It will execute the command,
    and then cause\n itself to be printed. */\n"))
  A(printf("/* Lastly, we call A on a command to print the remainder
    of the program;\n it will cause itself to be printed, and then
    execute the command. */\n}\n"))
/* Lastly, we call A on a command to print the remainder of the program;
 it will cause itself to be printed, and then execute the command. */
}

Como outros explicada, quines são programas que reproduzem cópias exatas de si mesmos.

Com relação às aplicações, se você acha que a lógica do DNA codifica para interpretar a si mesmo e se reproduzir - a resposta é bastante simples, sem o conceito de quines não estaria aqui e nunca seria capaz de criar artificial ( auto-reprodução) vida.

Este é o meu exemplo favorito C

char*p="char*p=%c%s%c;main(){printf(p,34,p,34);}";main(){printf(p,34,p,34);}

Duas coisas que eu aprendi com ele:

    espaço
  1. White não é necessário, mas não ajuda a legibilidade
  2. A função prinftf é realmente poderoso

Eu não pode apresentar quaisquer dados para dizer que escrever um Quine ou dois expandiu minha mente ou me um programador melhor feito. Mas é divertido de fazer, pelo menos, o primeiro par de vezes. De qualquer forma, você perguntou sobre como escrever um. Eu posso apontar-lhe algumas referências bem escritos:

Craig Kaplan tem um papel puro que descreve como realmente produzir quines:

  • O Procurar código autodocumentados
    • Este relatório examina o problema de escrever um programa de auto-documentando: um programa que, quando executado, produz-se como saída. O problema é examinada a partir do ponto de vista da auto-de referência, o estabelecimento de um programa de auto-documentação deve apresentar. O relatório prossegue de programas de primeira que não conseguem funcionar corretamente, por meio de programas sucessivamente sofisticados que abordam uma solução, a trabalhar programas de auto-documentar. Em seguida, ele recua um pouco e mostra como alguns programas consigo enganar e ainda se encaixam na definição de um programa de auto-documentação, sugerindo melhorias para essa definição. A cada passo, os endereços de relatórios como os programas dados demonstram a relação sutil entre programação de computadores e auto-referência.

Você também pode encontrar "Quines (programas auto-replicantes)" de David Madore interessante leitura.

Finalmente, se você quiser ver as implementações, consulte a Quine Página onde pode encontrar quines em várias línguas e outras matérias relacionadas.

O que quines utilizado? Programação exercícios e vírus.

Um vírus precisa replicar alguma forma - e é uma maneira de torná-lo um Quine. Vamos dizer que um programa antivírus hipotética iria sinalizar qualquer processo que ler o seu próprio binário na memória (para passá-lo para a vítima); a maneira de contornar isso seria para tê-lo em si saída.

Tenha em mente que um Quine em código de máquina que não necessitam de compilação.

one Aqui em Python (que é feio, eu só escrevi para testá-lo). nem sabia que isso era chamado de Quine na época.

def e(s): print s[:42]+s[42:].replace('#','"'); print 'e("""'+s+'""")'
e("""def e(s): print s[:42]+s[42:].replace('#','"'); print 'e(###'+s+'###)'""")

Oh, e para responder a outra pergunta:. Quines são totalmente inúteis

Eu escrevi meu primeiro Quine em 1979 - em Fortran. I tem um pensamento aleatório no outro dia sobre Quines em PHP e senti como a afixação da mesma Q como o OP, mas ser um bom menino eu primeiro verificado o Q & A D / B. De qualquer forma para a posteridade aqui é o meu PHP (CLI) Quine. Eu ficaria interesse em quaisquer variantes mais curtas. : -)

<?php $x='<?php $x=0;echo strtr( $x, array(chr(39).$x.chr(39)));';echo strtr( $x, array(chr(39).$x.chr(39)));

109 bytes, mas com o último CR cortado. Isso sem contar a "enganar":

<?php readfile( __FILE__);

E este QuineProgram wiki cita ainda menos um:

<?php printf($a='<?php printf($a=%c%s%c,39,$a,39);',39,$a,39);

Este é um Quine interessante em c ++: http://npcomplete.weebly.com/1/post/2010/02/self-reproducing-c-program-quine.html

Quines são para se divertir. Eles não têm nenhum uso prático, tanto quanto eu sei.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top