这是一个特殊的 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 的描述。

也许更深入,你可以用许多不同的语言在圆圈上获得更多的角落。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top