相争不足 共享有余

最蛋疼的代码:ruby代码生成python代码,然后python代码生成perl代码,然后perl代码生成lua代码 …

电脑技术 moonygao 840℃ 0评论

Quine 就是运行完输出源代码的程序。

最近有个闲的蛋疼的人玩出了新境界 …… 11 种语言跑完变回最开始的代码。

引用
The Ruby code generates Python code,
which generates Perl code,
which generates Lua code,
which generates OCaml code,
which generates Haskell code,
which generates C code,
which generates Java code,
which generates Brainfμck code,
which generates Whitespace code,
which generates Unlambda code,
which generates the original Ruby code again.

代码如下。(注意:删掉换行,把 μ 替换成 u)

引用
# 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+""-- haskel
l"+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+""brainfμck"+l*64+"n++++++++[>++++
<-]+++++++++>>++++++++++"+l*31+""++(concat(snd(mapAccumL h 2("+l*31+""110"+l*31
+""++g(length s)++"+l*31+""22111211100111112021111102011112120012"+l*31+""++co
ncatMap("+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+""2100211101012021122
2211211101000120211021120221102111000110120211202"+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=Not
hing;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"

运行一趟不容易:

Console代码
  1. $ ruby QuineRelay.rb > QuineRelay.py
  2. $ python QuineRelay.py > QuineRelay.pl
  3. $ perl QuineRelay.pl > QuineRelay.lua
  4. $ lua QuineRelay.lua > QuineRelay.ml
  5. $ ocaml QuineRelay.ml > QuineRelay.hs
  6. $ runghc QuineRelay.hs > QuineRelay.c
  7. $ gcc -Wall -o QuineRelay QuineRelay.c && ./QuineRelay > QuineRelay.java
  8. $ javac QuineRelay.java && java QuineRelay > QuineRelay.bf
  9. $ beef QuineRelay.bf > QuineRelay.ws
  10. $ wspace QuineRelay.ws > QuineRelay.unl
  11. $ unlambda QuineRelay.unl > QuineRelay2.rb

最后可以看看是不是一摸一样?

Console代码
  1. $ diff QuineRelay.rb QuineRelay2.rb

搬运搬到底:推荐运行环境

* ruby 1.8.7-p72
* Python 2.5.2
* perl v5.10.0
* Lua 5.0.3
* OCaml 3.10.2
* ghc-6.8.2
* gcc 4.3.2
* java “1.5.0_17”
* beef 0.0.6-2
* whitespace 0.3-2
* unlambda 2.0.0-5

转载请注明:IT起义 » 最蛋疼的代码:ruby代码生成python代码,然后python代码生成perl代码,然后perl代码生成lua代码 …

喜欢 (0)or分享 (0)