2009-08-28 6 views
5
ここ

高次のQuineプログラムを構築することについての考え方はありますか?

がより正確であるために(http://blog.sigfpe.com/2008/02/third-order-quine-in-three-languages.htmlから)元のHaskellのプログラムを出力するRubyプログラムを出力するPythonプログラムを出力する特殊なHaskellのプログラムであり、出力は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プログラム、実行後のRubyプログラムを出力

$ 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 ++ [')']") 

あります0

$ 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プログラムを出力します。従来QUINEプログラムはpartAがpartBの記述を含み、partBが記述からAを計算する二つの部分でプログラムを分離することによって構築することができるので

$ 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" 

しかし、このような3次のキーンはどのように構成されましたか?

+0

http://www.reddit.com/r/programming/comments/9ot8y/quinerelay_with_11_programming_languages/ – sdcvvc

答えて

2

まず、this programming assignmentの周りに頭を包みます。あなたがそれに時間を費やすと、それは実際には難しいことではないと私は信じています。この考え方は、別のプログラムを入力として取り込み、2つのプログラムを結合して独自のテキストを理解する出力として第3のプログラムを吐き出すプログラムを書くことができるということです。これは一種の高次の宝石です。 3つのプログラミング言語のすべての構造を理解しているなら、この課題からアイデアを引き出し、さらに拡張することができます。

2

Kleene's recursion theorem理論上、ほぼすべての言語でquineを構築することができます。 (More information here.)私は今までそれを稼働させていませんでした。

高次クインの場合、考慮する機能は言語の評価メカニズムの構成です。あなたがKRTから基本的なquineを得ることができるなら、多分あなたはそれから高次のquineを得ることに行くことができます。

1

この記事の最初の段落で、私は簡単な説明を書いた。私はそこから始めることを勧めます。

BarwiseとMossのVicious Circlesという本からこれらのテクニックのいくつかを学びました。

0

私はプログラマ(!)ではないんだけど私には、このような音:

... - > C - > A - > B - > C-> A-> B - > C - > ...

本当にかすれないか、終わらない(三角)サークル悪質なサークル。

プログラムCの説明cointain A.の記述を含むCの説明cointain C.

プログラムBの記述を含むBの説明cointain

プログラムAに含まれますdescription of B.

もっと深くなっていくと、おそらく多くの言語で円を描くことができます。

関連する問題