感谢你的到来
一起学习进步

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

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

赞(0) 打赏
未经允许不得转载:IT起义 » 最蛋疼的代码:ruby代码生成python代码,然后python代码生成perl代码,然后perl代码生成lua代码 …
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏