Подтвердить что ты не робот

Что такое quines? Любая конкретная цель иметь их?

Я наткнулся на этот термин - Quine (также называемый самовоспроизводящимися программами). Просто хотел узнать больше об этом. Как написать quine и использовать ли они где угодно, или это просто упражнение для удовольствия?

Я начал с Python, и я мог бы написать письмо на Python. Любые предложения?

4b9b3361

Ответ 1

Куины бесполезны в практическом смысле, но они - отличное упражнение, чтобы помочь вам больше узнать о языке.

Здесь очень краткий в python:

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

Ответ 2

Как минимум, quines - это программы, которые создают свой собственный источник как свой вывод. Они являются необходимым шагом в построении доказательство Гёделя относительно неполноты.

Является ли это практическим применением, я не предлагаю никаких комментариев.

Ответ 3

Quine - это компьютерная программа, которая в качестве единственного выхода создает копию своего исходного кода.

Я еще не видел практического использования для одного, но я уверен, что там где-то там.


Пример Python (найден здесь)

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

C Пример (найден здесь

#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. */
}

Ответ 4

Как объясняют другие, quines - это программы, которые воспроизводят точные копии самих себя.

Что касается приложений, если вы считаете, что ДНК кодирует логику для интерпретации себя и воспроизводит себя - ответ довольно прост, без понятия quines мы бы не были здесь, и мы бы никогда не смогли создать искусственные ( самовоспроизводящаяся) жизнь.

Ответ 5

Это мой любимый пример C

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

Две вещи, которые я узнал от него:

  • Белое пространство не требуется, но помогает читать.
  • Функция prinftf действительно мощна.

Ответ 6

Я не могу представить какие-либо данные, чтобы сказать, что написание одного или двух вопросов расширило мой разум или сделало меня лучшим программистом. Но это забавно, по крайней мере, первые пару раз. В любом случае, вы спросили о том, как его написать. Я могу указать на некоторые хорошо написанные ссылки:

Крейг Каплан имеет аккуратную бумагу, в которой описывается, как на самом деле производить quines:

  • Поиск самодокументирующего кода
    • В этом отчете рассматривается проблема написания самодокументирующей программы: программа, которая при запуске производит себя как вывод. Проблема рассматривается с точки зрения самореференции, которую должна проявить самодокументируемая программа. Отчет исходит из ранних программ, которые не работают корректно, с помощью последовательных сложных программ, которые подходят к решению, к работающим самодокументируемым программам. Затем он немного отступает и показывает, как некоторые программы могут обманывать и по-прежнему соответствовать определению самодокументирующей программы, предлагая улучшения этого определения. На каждом этапе в отчете рассматривается, как данные программы демонстрируют тонкую взаимосвязь между компьютерным программированием и самоналожением.

Вы также можете найти Дэвида Мадоре "Quines (самовоспроизводящиеся программы)" интересное чтение.

Наконец, если вы хотите увидеть реализации, посмотрите Страница Quine, где вы можете найти quines на разных языках и другие связанные вопросы.

Ответ 7

Здесь один в Python (это уродливо, я просто написал его, чтобы попробовать). Даже не знал, что тогда это называлось quine.

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+'###)'""")

О, и ответить на ваш другой вопрос: Quines абсолютно бесполезны.

Ответ 8

Для чего используются quines? Программирование упражнений и вирусов.

Вирус должен как-то реплицироваться, и один из способов - сделать это quine. Скажем, что гипотетическая антивирусная программа будет отмечать любой процесс, который считывает свой собственный двоичный код в память (передать его предполагаемой жертве); способ обойти это, чтобы он сам выдавал себя.

Имейте в виду, что quine в машинный код не требует компиляции.

Ответ 9

Я написал свой первый Quine в 1979 году - в Фортране. На днях я случайно подумал о Quines на PHP и почувствовал, что отправляю тот же Q, что и OP, но будучи хорошим мальчиком, я сначала проверил Q & A D/B. В любом случае для потомков здесь мой PHP (cli) quine. Я был бы заинтересован в любых более коротких вариантах.: -)

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

109 байт, но с последним отключенным CR. Это не считая "чит":

<?php readfile( __FILE__);

И эта QuineProgram вики цитирует еще более короткую:

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