关于 quine 程序的面试问题的主要目的通常是看看您以前是否遇到过它们。它们在任何其他意义上几乎没有用处。
上面的代码可以适度升级以制作符合C99标准的程序(根据GCC),如下所示:
汇编
/usr/bin/gcc -O3 -g -std=c99 -Wall -Wextra -Wmissing-prototypes \
-Wstrict-prototypes -Wold-style-definition quine.c -o quine
Code
#include <stdio.h>
char*s="#include <stdio.h>%cchar*s=%c%s%c;%cint main(void){printf(s,10,34,s,34,10,10);}%c";
int main(void){printf(s,10,34,s,34,10,10);}
请注意,这假设一个代码集,其中"
是代码点 34,换行符是代码点 10。与原始版本不同,此版本在末尾打印换行符。它还包含#include <stdio.h>
这是所需要的,并且行几乎足够短,可以在没有水平滚动条的情况下工作。只要再多努力一点,毫无疑问可以把它做得足够短。
Test
奎因程序的严格测试是:
./quine | diff quine.c -
如果源代码和输出之间存在差异,则会报告。
“类奎因”技术的几乎有用的应用
早在我年轻的时候,我就制作过一个双语的“自我复制”节目。它是 shell 脚本和 Informix-4GL (I4GL) 源代码的组合。使这成为可能的一个特性是 I4GL 对待{ ... }
作为注释,但 shell 将其视为 I/O 重定向的单元。 I4GL还有#...EOL
注释,shell 也是如此。文件顶部的 shell 脚本包含数据和操作,用于以不支持指针的语言重新生成复杂的验证操作序列。数据控制我们生成哪些 I4GL 函数以及每个函数的生成方式。然后编译 I4GL 代码以每周验证从外部数据源导入的数据。
如果您运行该文件(将其称为file0.4gl
)作为 shell 脚本并捕获输出(称之为file1.4gl
),然后运行file1.4gl
作为 shell 脚本并捕获输出file2.4gl
, 两个文件file1.4gl
and file2.4gl
会是相同的。然而,file0.4gl
可能会丢失所有生成的 I4GL 代码,只要文件顶部的 shell 脚本“注释”没有损坏,它就会重新生成一个自我复制文件。