我已经看到很多基于C/C++的解决方案来解决这个问题,我们必须编写一个程序,在执行时打印自己的源代码.
一些解决方案
http://www.cprogramming.com/challenges/solutions/self_print.html
Quine Page解决方案有多种语言版本
网上有更多解决方案,每个解决方案都不同.我想知道我们如何处理这样一个问题,解决它的人心中的问题.请给我一些关于这个问题的见解...虽然解释语言中的解决方案如perl,php,ruby等可能很容易......我想知道如何用编译语言设计它...
除了作弊¹,编译语言和解释语言之间没有区别.
quines的通用方法非常简单.首先,无论程序是什么样的,在某些时候它必须打印一些东西:
print ...
但是,应该打印什么?本身.所以它需要打印"print"命令:
print "print ..."
下一步应该打印什么?那么,在程序增长的同时,它也需要打印以"print"开头的字符串:
print "print \"print ...\""
现在程序再次增长,所以还有更多要打印:
print "print \"print \\\"...\\\"\""
等等.每增加一个代码,就会有更多代码需要打印.这种方法无处可去,但它揭示了一个有趣的模式:字符串"print \""一遍又一遍地重复.将重复部分放入变量会很好:
a = "print \"" print a
但是,程序刚改变了,所以我们需要调整一个:
a = "a = ...\nprint a" print a
当我们现在尝试填写"......"时,我们遇到了和以前一样的问题.最终,我们想写这样的东西:
a = "a = " + (quoted contents of a) + "\nprint a" print a
但这是不可能的,因为即使我们有这样的quoted()
引用功能,仍然存在我们a
根据自身定义的问题:
a = "a = " + quoted(a) + "\nprint a" print a
所以我们唯一能做的就是把一个占位符放入a
:
a = "a = @\nprint a" print a
这就是全部技巧!其他任何事情现在都清楚了.只需用以下内容的引用内容替换占位符a
:
a = "a = @\nprint a" print a.replace("@", quoted(a))
由于我们已经更改了代码,我们需要调整字符串:
a = "a = @\nprint a.replace(\"@\", quoted(a))" print a.replace("@", quoted(a))
就是这样!所有语言中的所有quines都以这种方式工作(欺骗者除外).
那么,你应该确保只更换占位符的第一个出现位置.如果你使用第二名持有人,你可以避免引用字符串.
但这些都是小问题,很容易解决.事实上,实现quoted()
并且replace()
是各种细节真正不同的唯一细节.
¹使程序读取其源文件
编写quines有几种不同的策略.显而易见的是只编写打开代码并将其打印出来的代码.但更有趣的是涉及允许自嵌入的语言功能,例如许多语言中的%s风格的printf功能.您必须弄清楚如何嵌入某些内容,以便最终解析为嵌入请求.我怀疑,像palindromes一样,涉及很多试验和错误.