Путаница Куайна. Что на самом деле печатает Куайна?
Печатает ли quine АКТУАЛЬНЫЙ код программы, т.е. не запутанный, или печатает запутанную программу?
5 ответов
Я не думаю, что запутывание имеет какое-либо отношение к этому. Обычно quine печатает фактический исходный код самой программы.
Предположим, что у вас есть программа на C, которая печатает "обфусцированную" или иным образом косметически модифицированную версию ее источника. Например, предположим, что есть разница в пробелах или именах переменных.
Тогда эта программа не была бы квине, поскольку по определению квина - это программа, которая печатает сама себя, и под "самой собой" мы подразумеваем точно такую же последовательность байтов. Но выходные данные этой программы, после компиляции, будут печатать то же самое, что и исходная программа (поскольку это всего лишь косметический вариант), то есть она сама. Таким образом, на выходе получится quine.
Иногда это облегчает процесс написания квин - просто напишите "почти квин", что, возможно, не дает правильного форматирования, запустите его один раз, и на выходе получится ваш реальный квин.
Это все предполагает, что квинту в Си. Quine в машинном коде x86 должен был бы выводить не его источник C, а ту же последовательность байтов, которая составляет файл.exe.
Я не уверен, что вы имеете в виду под "АКТУАЛЬНЫМ кодом", в отличие от "запутанного кода", но чтобы проверить, является ли что-то квин или нет, вам нужно решить, на каком языке он должен быть квин. Возможно, решив, что Вы можете ответить на свой вопрос - хотите ли вы просто квин на Си или квин, которая имеет какое-то отношение к вашему обфускатору?
Вот фактическая квинна в стандарте C, найденная в Википедии:
main() { char *s="main() { char *s=%c%s%c; printf(s,34,s,34); }"; printf(s,34,s,34); }
Вы заметите, что его структура относительно проста. Он использует строковую константу, содержащую текст программы, как строку формата, так и одно из значений, которые должны быть отформатированы printf()
,
При компиляции и запуске он печатает именно эту строку кода.
В вики-статье есть примеры квинов на разных языках, в том числе на C.
Ниже приведен простой код квин. Этот исходный код необходимо сохранить как "quine_file.c". Скомпилируйте и выполните.
Здесь берется простой указатель файла, и он используется для построчного чтения исходного файла и его вывода на стандартный вывод.
#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE *fp = NULL;
char * line = NULL;
int len = 0;
int read;
fp = fopen("quine_file.c","r");
if(fp == NULL)
return;
while ((read = getline(&line, &len, fp)) != -1)
{
printf("%s", line);
}
fclose(fp);
if (line)
free(line);
exit(EXIT_SUCCESS);
}
Quine - это программа, которая печатает свой собственный листинг. Это означает, что при запуске программы она должна распечатать именно те инструкции, которые программист написал как часть программы (включая, конечно, инструкции, которые выполняют печать, и данные, используемые при печати).
- Дэвид Мадор
Пример JavaScript
$=_=>`$=${$};$()`;$();
при выполнении эта программа отобразит в консоли следующую строку
"$=_=>`$=${$};$()`;$();"
Показано в искусстве кодирования видео @ 30 мин. 21 сек.- Дилан Битти
#include <stdio.h>
main(){
FILE* fp = fopen("printItself.c", "r");
int c;
while ((c = getc(fp)) != EOF) putc(c, stdout);
}
Сохраните его в файле с именем printItself.c ... Проблема с предыдущим примером заключается в том, что если я добавлю строку в программу, например, int x; мне нужно будет добавить его в строку, также заботясь о новой строке, пробелах и т. д., но в этом примере вы можете добавить все, что захотите.