小日本太变半夜凉初透态了:11门语言的quine接力

A Neighborhood of Infinity当年的牛逼之作A Third Order Quine in Three Languages可以说已经是惊为天人了。什么东西呢?
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"

这是一个Haskell程序源码,运行一下可以得到一个Python程序源码,再运行一下这个Python程序,可以得到一个Ruby程序源码,再运行一下这个Ruby程序可以得到最开始的Haskell程序源码。这就是triple quine

今天在proggit上看到更加变半夜凉初透态的:11们语言的quine接力。。。。orz。。。小日本果然变半夜凉初透态。。。

原文在:http://d.hatena.ne.jp/ku-ma-me/20090916/p1

代码是:
# ruby
l=92.chr;eval s="s=s.dump[r=1..-2].gsub(/("+l*4+"){4,}(?!\")/){|t|'\"+l*%d+\"'%(t.size/2)};5.times{s=s.dump[r]};puts\"# python\\nprint(\\\"# perl\\\\nprint(\\\\\\\"# lua"+l*4+"nprint("+l*7+"\"(* ocaml *)"+l*8+"nprint_endline"+l*15+"\"-- haskell"+l*16+"nimport Data.List;import Data.Bits;import Data.Char;main=putStrLn("+l*31+"\"/* C */"+l*32+"n#include<stdio.h>"+l*32+"nint main(void){char*s[501]={"+l*31+"\"++intercalate"+l*31+"\","+l*31+"\"(c(tail(init(show("+l*31+"\"/* Java */"+l*32+"npublic class QuineRelay{public static void main(String[]a){String[]s={"+l*31+"\"++intercalate"+l*31+"\","+l*31+"\"(c("+l*31+"\"brainfuck"+l*64+"n++++++++[>++++<-]+++++++++>>++++++++++"+l*31+"\"++(concat(snd(mapAccumL h 2("+l*31+"\"110"+l*31+"\"++g(length s)++"+l*31+"\"22111211100111112021111102011112120012"+l*31+"\"++concatMap("+l*32+"c->let d=ord c in if d<11then"+l*31+"\"21002"+l*31+"\"else"+l*31+"\"111"+l*31+"\"++g d++"+l*31+"\"22102"+l*31+"\")s++"+l*31+"\"21002111010120211222211211101000120211021120221102111000110120211202"+l*31+"\"))))))++"+l*31+"\","+l*63+"\""+l*64+"n"+l*63+"\"};int i=0;for(;i<94;i++)System.out.print(s[i]);}}"+l*31+"\")))))++"+l*31+"\",0};int i=0;for(;s[i];i++)printf("+l*63+"\"%s"+l*63+"\",s[i]);puts("+l*63+"\""+l*63+"\");return 0;}"+l*31+"\");c s=map("+l*32+"s->"+l*31+"\""+l*63+"\""+l*31+"\"++s++"+l*31+"\""+l*63+"\""+l*31+"\")(unfoldr t s);t[]=Nothing;t s=Just(splitAt(if length s>w&&s!!w=='"+l*31+"\"'then 501else w)s);w=500;f 0=Nothing;f x=Just((if x`mod`2>0then '0'else '1'),x`div`2);g x= reverse (unfoldr f x);h p c=let d=ord c-48in(d,replicate(abs(p-d))(if d<p then '<'else '>')++"+l*31+"\"."+l*31+"\");s="+l*31+"\"# ruby"+l*32+"n"+l*31+"\"++"+l*31+"\"l=92.chr;eval s=\"+(z=l*31)+\"\\\"\"+s+z+\"\\\""+l*31+"\"++"+l*31+"\""+l*32+"n"+l*31+"\""+l*15+"\""+l*7+"\")"+l*4+"n\\\\\\\")\\\")\"########### (c) Yusuke Endoh, 2009 ###########\n"

当然自己试的时候需要处理好缩进和换行问题。

是这11门语言的quine:

  1. ruby 1.8.7-p72
  2. Python 2.5.2
  3. perl v5.10.0
  4. Lua 5.0.3
  5. OCaml 3.10.2
  6. ghc-6.8.2
  7. gcc 4.3.2
  8. java "1.5.0_17"
  9. beef 0.0.6-2
  10. whitespace 0.3-2
  11. unlambda 2.0.0-5

卧槽。。。。HOLYFUCK!

标签:

12 条评论 发表在“小日本太变半夜凉初透态了:11门语言的quine接力”上

  1. bones7456 说到:

    汗。。有人来验证下不?

  2. hite 说到:

    有点像回文诗

  3. unixhater 说到:

    语言打包党

  4. livecn 说到:

    有看到Brainfuck呀。

  5. mark 说到:

    其实这种程序一点都不难,如果正向去想,你可能觉得太牛B,但是如果逆向思考就非常简单了。简单来说:
    最后的结果是“Z”,那我就想用“Y”怎么生成“Z”,这样就有了“Y”,有了“Y”,就想“X”怎么生成“Y”,这个就一点难度都没有,以此类推,最后到“A”,这时公布的“A”就是一个看起来牛B的程序了。

    • est 说到:

      你那个不是quine。你先思考下单个quine的情况吧。再想一下2门语言怎么quine。

    • laiwei 说到:

      你这个确实不是quine
      因为你必须保证Z=A
      呵呵
      这才是最难的地方

      • hhb 说到:

        其实也不难。用这种结构:

        char s[]=program follow;//在s中保存除本行外其余程序代码。
        int main() {
        output "s=\""+s+"\";";
        output s;
        }

        多语言就是考虑怎么把各个语言的代码打包起来了。

  6. 半瓶墨水 说到:

    @mark,这样是不难,难的是,最后要绕回去...

  7. nathanyangf 说到:

    请教:在一个exe里面嵌入一个MD5值,要求嵌入以后整个exe的MD5值等于所嵌入的MD5值,这个问题跟quine有没有类似之处呢?

  8. ys_sunshine 说到:

    很好很强大。。。。。

  9. kenan 说到:

    当你会写一个程序自我quine时,你会发现这种不同语言quine接力太简单了

留下回复