Изменения

Перейти к: навигация, поиск

Квайны

1918 байт убрано, 14:53, 6 января 2015
Общий принцип написания квайнов
==Общий принцип написания квайнов==
Квайн состоит из двух сегментов: <b>кода</b> и <b>данных</b>. Данные представляют собой текстовую версию кода, и, как правило, получаются из кода простым добавлением обрамляющих кавычек. Код, в свою очередь, сначала использует данные, чтобы вывести код(содержащийся в них), а затем, просто выводит данные.
Чтобы написать простой квайн на C, мы положим в данные текстовое представление кода и при выводе данных будем экранировать знаки табуляции и переносов: <nowiki>const char data Формально общий принцип написания квайнов содержит доказательство [] ="#include <stdio.h>\n\nint\nmain (void)\n{\n unsigned int i;\n\n p""rintf (\"const char data [] =\");\n for ( i=0 ; data[i] ; i++ "")\n {\n if ( i%60 == 0 )\n\tprintf (\"\\n\\\"\");\n switc""h ( data[i] )\n\t{\n\tcase '\\\\':\n\tcase '\"':\n\t printf (\"\\\\%c\", d""ata[i]);\n\t break;\n\tcase '\\n':\n\t printf (\"\\\\n\");\n\t break;\n""\tcase '\\t':\n\t printf (\"\\\\t\");\n\t break;\n\tdefault:\n\t printf"" (\"%c\", data[i]);\n\t}\n if ( i%60 == 59 || !data[i+1] )\n\t""printf (\"\\\"\");\n }\n printf (\";\\n\\n\");\n for ( i=0 ; data[""i] ; i++ )\n putchar (data[i]);\n return 0;\n}\n"; #include <stdio.h> intmain (void){ unsigned int i;  printf ("const char data [] ="); for ( i=0 ; data[i] ; i++ ) { if ( i%60 == 0 ) printf ("\n\""); switch ( data[i] ) { case '\\': case '"': printf ("\\%c", data[i]); break; case '\n': printf ("\\n"); break; case '\t': printf ("\\t"); break; default: printf ("%c", data[i]); } if ( i%60 == 59 Теорема о рекурсии|| !data[i+1теоремы о рекурсии] ) printf ("\""); } printf (";\n\n"); for ( i=0 ; data[i] ; i++ ) putchar (data[i]); return 0;}</nowiki> Можно представить сегмент данных как некий шифр, который можно расшифровать двумя способами. В результате расшифровки первым способом получится строковое представление собственно сегмента данных, при расшифровке вторым способом получится строковое представление сегмента кода. Объединив результаты этих расшифровок, мы получим строку, в которой содержится весь исходный код программыДалее будет рассмотрено понятие мульти-квайна.
==Связанные определения==
Анонимный участник

Навигация