关于quine项目的面试问题的主要目的通常是看看你以前是否遇到过它们。它们几乎在任何其他意义上都没有用。
上面的代码可以适度升级,制作一个符合 C99 的程序(根据 GCC),如下:
汇编
/usr/bin/gcc -O3 -g -std=c99 -Wall -Wextra -Wmissing-prototypes \
-Wstrict-prototypes -Wold-style-definition quine.c -o quine
代码
#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>
所需的内容,并且行几乎足够短,可以在没有水平滚动条的情况下处理 SO。再努力一点,它无疑可以做得足够短。
测试
quine 程序的酸性测试是:
./quine | diff quine.c -
如果源代码和输出之间有差异,将会报告。
“类似quine”技术的一个几乎有用的应用
早在我年轻的时候,我就制作了一个双语“自我复制”程序。它是 shell 脚本和 Informix-4GL (I4GL) 源代码的组合。使这成为可能的一个属性是 I4GL 将{ ... }
其视为注释,但 shell 将其视为 I/O 重定向单元。I4GL 也有#...EOL
注释,shell 也有。文件顶部的 shell 脚本包含数据和操作,以不支持指针的语言重新生成复杂的验证操作序列。数据控制了我们生成了哪些 I4GL 函数以及每个函数是如何生成的。然后编译 I4GL 代码,以每周验证从外部数据源导入的数据。
如果您将文件(调用它file0.4gl
)作为 shell 脚本运行并捕获输出(调用 that file1.4gl
),然后file1.4gl
作为 shell 脚本运行并捕获输出,file2.4gl
那么这两个文件将是相同的。但是,可能会丢失所有生成的 I4GL 代码,只要文件顶部的 shell 脚本“注释”没有损坏,它就会重新生成一个自我复制的文件。file1.4gl
file2.4gl
file0.4gl