Tuesday, February 05, 2008

A Third Order Quine in Three Languages

Suppose Fnxy is a program, written in language x, that takes as input n string arguments as input, G1,...,Gn and outputs a program in language y that is the application of the function whose source code is G2 to the strings G2,G3,...,Gn,G1. Then F3xy(F3xy,F3yz,F3zx) will be a program in language x that that outputs a program in y that computes F3yz(F3yz,F3zx,F3xy).

We can put this into practice:


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"


This is a Haskell program that outputs a Python program that outputs a Ruby program that outputs the original Haskell program.

Apologies for the lack of line breaks. If it's not readable, it should be possible to copy and paste that source. Also, you may need to tweak it if your OS doesn't treat character 10 as a new line.

Labels: , ,

posted by sigfpe at Tuesday, February 05, 2008

15 Comments:

Anonymous Anonymous said...

That is awesome.

Wednesday, 06 February, 2008
Blogger Nikolay said...

[15:27 /]$ ghci
___ ___ _
/ _ \ /\ /\/ __(_)
/ /_\// /_/ / / | | GHC Interactive, version 6.6.1, for Haskell 98.
/ /_\\/ __ / /___| | http://www.haskell.org/ghc/
\____/\/ /_/\____/|_| Type :? for help.

Prelude> q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']
< interactive>:1:7: parse error on input `='

Wednesday, 06 February, 2008
Anonymous Anonymous said...

Impressive O_O

Wednesday, 06 February, 2008
Blogger Brent said...

nice!

Nikolay: you won't be able to just paste it into ghci like that, you'll have to put it in a file and then load the file into ghci.

Wednesday, 06 February, 2008
Anonymous Anonymous said...

nikolay:
Write it into .hs file and use runhaskell to execute it.
ghci expects let before name bindings to distinguish them from expressions.

Wednesday, 06 February, 2008
Blogger Nikolay said...

Ooh, I see. Thanks! It is really awesome!

Wednesday, 06 February, 2008
Anonymous Anonymous said...

Wow! That is really awesome.

Friday, 08 February, 2008
Anonymous Anonymous said...

Wow! You're all dorks

Wednesday, 13 February, 2008
Anonymous Anonymous said...

Amazing :)

Wednesday, 19 March, 2008
Anonymous Anonymous said...

...please where can I buy a unicorn?

Wednesday, 16 December, 2009
Blogger paurullan said...

Gorgeous!

Wednesday, 31 March, 2010
Blogger Paul Hobbs said...

This is so fascinating! You are awesome =]

Monday, 20 September, 2010
Anonymous Anonymous said...

What this really needs is a recursive function

Tuesday, 25 January, 2011
Anonymous Anonymous said...

it formatted my pr0n.

Tuesday, 25 January, 2011
Anonymous Anonymous said...

runhaskell 3quine |python|ruby|diff 3quine -


*blinks*
*awe*

Wednesday, 26 January, 2011

Post a Comment

<< Home

AltStyle によって変換されたページ (->オリジナル) /