【发布时间】:2010-09-05 07:40:00
【问题描述】:
quine 打印程序的实际代码(即未混淆)还是打印混淆程序?
【问题讨论】:
quine 打印程序的实际代码(即未混淆)还是打印混淆程序?
【问题讨论】:
我不认为混淆与它有任何关系。通常,quine 会打印程序本身的实际源代码。
【讨论】:
假设您有一个 C 程序,它打印其源代码的“混淆”或其他修饰版本。例如,假设空格或变量名称有所不同。
那么那个程序就不是一个 quine,因为根据定义,一个 quine 是一个打印自己的程序,而“它自己”是指完全相同的字节序列。但是该程序的输出,一旦编译,将打印与原始程序相同的内容(因为它只是一个装饰变体),即它本身。所以输出是一个quine。
这有时会简化编写 quine 的过程 - 只需编写一个“nearly-quine”,它可能无法获得完全正确的格式,运行一次,输出就是您的实际 quine。
这一切都假设一个 quine 在 C 中。 x86 机器代码中的 quine 必须输出的不是其 C 源代码,而是构成 .exe 文件的相同字节序列。
我不确定您所说的“实际代码”与“混淆代码”是什么意思,但要测试某物是否是 quine,您必须确定它应该是哪种语言。也许通过决定您可以回答自己的问题 - 您只是想要 C 中的 quine,还是与您的混淆器有关的 quine?
【讨论】:
这是标准 C 中的实际 quine,位于 Wikipedia:
main() { char *s="main() { char *s=%c%s%c; printf(s,34,s,34); }"; printf(s,34,s,34); }
您会注意到它的结构相对简单。它使用包含程序文本的字符串常量作为格式字符串和要由printf() 格式化的值之一。
编译并运行时,它会准确打印出那一行代码。
wiki 文章中有多种语言的 quines 示例,包括 C 语言中的更多示例。
【讨论】:
以下是一个简单的 quine 代码。此源代码需要保存为“quine_file.c”。编译并执行。
这里取了一个简单的文件指针,用于逐行读取源文件并打印到stdout。
#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 示例
$=_=>`$=${$};$()`;$();
这个程序在执行时会显示以下字符串
"$=_=>`$=${$};$()`;$();"
在代码艺术中精选 video @ 30m21s - 迪伦·比蒂
【讨论】:
#include <stdio.h>
main(){
FILE* fp = fopen("printItself.c", "r");
int c;
while ((c = getc(fp)) != EOF) putc(c, stdout);
}
将它保存在一个名为 printItself.c 的文件中......前面例子的问题是,如果我在程序中添加一行,例如 int x;在处理换行符和空格等的同时,我还必须将其添加到字符串中......但在这个例子中,你可以添加任何你想要的东西。
【讨论】: