题
这是一个特殊的 Haskell 程序,它输出一个 Python 程序,该程序输出一个 Ruby 程序,该程序输出原始 Haskell 程序(来自 http://blog.sigfpe.com/2008/02/third-order-quine-in- Three-languages.html)
更准确地说,输出是这个 Haskell 程序的输出
q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']
main=q "q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']" "def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'" "def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end"
是一个Python程序,
$ runhaskell test.hs
def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'
q("def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'","def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end","q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']")
运行后输出一个 Ruby 程序,
$ runhaskell test.hs | python
def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end
q("def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end","q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']","def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'")
最后,Ruby 程序打印原始的 Haskell 程序。
$ runhaskell test.hs | python | ruby
q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']
main=q "q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']" "def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'" "def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end"
由于传统的 quine 程序可以通过将程序分为两部分来构建,其中部分 A 包含部分 B 的描述,部分 B 根据描述计算 A。
但这样的三阶奎因是如何构建的呢?
解决方案
首先,将头绕起来 这个编程作业. 。相信我,一旦你花一些时间,它实际上并不那么困难。这个想法是,您可以编写一个程序,该程序可以将另一个程序作为输入,并吐出第三个程序作为输出,该程序结合了两个程序并且还理解其自己的文本。这是一种高阶奎因。如果您了解所有三种编程语言的结构,您可以从本作业中获取想法并进一步扩展它们。
其他提示
克莱恩递归定理 理论上,几乎可以用任何语言构造 quine。(更多信息请点击这里。)虽然我自己到目前为止还没有设法让它发挥作用。
对于高阶 quine,要考虑的功能是语言评估机制的组成。如果你可以从 KRT 中得到一个基本的 quine,也许你可以尝试从中得到一个更高阶的 quine。
在那篇文章的第一段中,我写了一个简短的解释。我建议从那里开始。
我从 Barwise 和 Moss 所著的《Vicious Circles》一书中学到了一些技巧。
我不是程序员(!)但对我来说听起来像这样:
...-> C -> A -> B -> C-> A-> B -> C -> ...
没有真正开始或结束的恶性循环(三角形)。
程序 A 包含 B 的描述,而 B 又包含 C 的描述。
程序 B 包含对 C 的描述,而 C 又包含对 A 的描述。
程序 C 包含 A 的描述,而 A 的描述又包含 B 的描述。
也许更深入,你可以用许多不同的语言在圆圈上获得更多的角落。