Ответ 1
Куины бесполезны в практическом смысле, но они - отличное упражнение, чтобы помочь вам больше узнать о языке.
Здесь очень краткий в python:
a='a=%r;print a%%a';print a%a
Я наткнулся на этот термин - Quine (также называемый самовоспроизводящимися программами). Просто хотел узнать больше об этом. Как написать quine и использовать ли они где угодно, или это просто упражнение для удовольствия?
Я начал с Python, и я мог бы написать письмо на Python. Любые предложения?
Куины бесполезны в практическом смысле, но они - отличное упражнение, чтобы помочь вам больше узнать о языке.
Здесь очень краткий в python:
a='a=%r;print a%%a';print a%a
Как минимум, quines - это программы, которые создают свой собственный источник как свой вывод. Они являются необходимым шагом в построении доказательство Гёделя относительно неполноты.
Является ли это практическим применением, я не предлагаю никаких комментариев.
Quine - это компьютерная программа, которая в качестве единственного выхода создает копию своего исходного кода.
Я еще не видел практического использования для одного, но я уверен, что там где-то там.
print (lambda s:s+`s`+')')("print (lambda s:s+`s`+')')(")
#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. */
}
Как объясняют другие, quines - это программы, которые воспроизводят точные копии самих себя.
Что касается приложений, если вы считаете, что ДНК кодирует логику для интерпретации себя и воспроизводит себя - ответ довольно прост, без понятия quines мы бы не были здесь, и мы бы никогда не смогли создать искусственные ( самовоспроизводящаяся) жизнь.
Это мой любимый пример C
char*p="char*p=%c%s%c;main(){printf(p,34,p,34);}";main(){printf(p,34,p,34);}
Две вещи, которые я узнал от него:
Я не могу представить какие-либо данные, чтобы сказать, что написание одного или двух вопросов расширило мой разум или сделало меня лучшим программистом. Но это забавно, по крайней мере, первые пару раз. В любом случае, вы спросили о том, как его написать. Я могу указать на некоторые хорошо написанные ссылки:
Крейг Каплан имеет аккуратную бумагу, в которой описывается, как на самом деле производить quines:
Вы также можете найти Дэвида Мадоре "Quines (самовоспроизводящиеся программы)" интересное чтение.
Наконец, если вы хотите увидеть реализации, посмотрите Страница Quine, где вы можете найти quines на разных языках и другие связанные вопросы.
Здесь один в 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 абсолютно бесполезны.
Для чего используются quines? Программирование упражнений и вирусов.
Вирус должен как-то реплицироваться, и один из способов - сделать это quine. Скажем, что гипотетическая антивирусная программа будет отмечать любой процесс, который считывает свой собственный двоичный код в память (передать его предполагаемой жертве); способ обойти это, чтобы он сам выдавал себя.
Имейте в виду, что quine в машинный код не требует компиляции.
Я написал свой первый 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);
Это интересный вопрос в С++: http://npcomplete.weebly.com/1/post/2010/02/self-reproducing-c-program-quine.html
Куинцы для удовольствия. Насколько мне известно, они не имеют практического применения.