阅读更多
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"


运行一趟不容易:
$ ruby QuineRelay.rb > QuineRelay.py
$ python QuineRelay.py > QuineRelay.pl
$ perl QuineRelay.pl > QuineRelay.lua
$ lua QuineRelay.lua > QuineRelay.ml
$ ocaml QuineRelay.ml > QuineRelay.hs
$ runghc QuineRelay.hs > QuineRelay.c
$ gcc -Wall -o QuineRelay QuineRelay.c && ./QuineRelay > QuineRelay.java
$ javac QuineRelay.java && java QuineRelay > QuineRelay.bf
$ beef QuineRelay.bf > QuineRelay.ws
$ wspace QuineRelay.ws > QuineRelay.unl
$ unlambda QuineRelay.unl > QuineRelay2.rb


最后可以看看是不是一摸一样?
$ 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

来自: kumame
29
2
评论 共 29 条 请登录后发表评论
29 楼 wrj913 2011-11-29 11:22
厉害!!!
28 楼 cathong 2010-01-08 08:47

跑完疼还是疼完跑
27 楼 danielli007 2009-11-03 10:53
挺有意思,呵呵
26 楼 fykyx521 2009-10-18 09:12
一个字 牛
25 楼 xieye 2009-10-08 21:56
都写完后,大概蛋就不疼了。
24 楼 Hooopo 2009-10-02 00:22
据说是日本人

小日本真变态
23 楼 somefuture 2009-10-01 22:51
外国人啊,那就原谅他吧
22 楼 七月十五 2009-09-30 15:31
咸蛋超人
21 楼 mazda 2009-09-30 10:58
闲蛋超人阿
20 楼 whaosoft 2009-09-30 09:20
为什么要这样呢?
19 楼 wuyuwentian 2009-09-30 08:46
蛋好疼啊啊
18 楼 01404421 2009-09-30 08:45
编译能玩到这样也值得鼓励一下了,不过有时间写这样的程序为什么不搞些有用的东西出来呢
17 楼 houniao 2009-09-29 19:19
玩具而已,会点编译原理,随便转好了
16 楼 absolute 2009-09-29 17:40
蛋疼啊,凑齐五个字
15 楼 phoenixup 2009-09-29 17:11
算了,还是围观一下吧~~不发表意见~~其实,我的真实感觉是。。。毛病。。。。纯粹的自身感觉,无中伤任何人的意思。。
14 楼 jerry2801 2009-09-29 14:00
牛逼!~~~~~~~~
13 楼 jichongchong 2009-09-29 13:44
闲蛋超人阿
12 楼 jiorry 2009-09-29 13:30
蛋疼啊....
不是一般的疼
这蛋疼的不轻阿
11 楼 RednaxelaFX 2009-09-29 13:08
mathfox 写道
generates C code??

意思,是不是能编译成本地执行了。不用VM?

是这个程序的其中一步生成了C源码,输出到标准输出流上。你看执行步骤里要用到gcc编译那个生成的C源码来生成下一步的代码……
10 楼 quiii 2009-09-29 13:07
gmizr 写道
不是一般的疼

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • java汉字乱码终极解决代码

    开发中前台页面向后台传参,汉字乱码,看了好多网上的方法都解决不了,所以写了一个工具类,判断是乱码就转换,不乱码就不乱换,汉字字母符号自动判断。最后完美解决汉字乱码问题。

  • 刨析 equals 比较 漏洞与误区

    本篇文章讲的是从JVM角度 刨析 == 和 equals 的 区别

  • java中文输出乱码_java汉字乱码解决办法

    自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。一、Java中文问题的由来Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。首先Java(包括J...

  • Java获取汉字对应的拼音(全拼或首字母)

    这篇文章主要介绍了Java如何获取汉字对应的拼音(全拼或首字母),文中实现的方法是引用了pinyin4j-2.5.0.jar,然后给出了完整的示例代码,有需要的朋友可以参考借鉴,下面来一起看看吧。 Java 根据汉语字符串获得对应的拼音字符串或者拼音首字母字符串等操作,需要添加jar包: 引入pinyin4j-2.5.0.jar包 代码实现: package com.smartT......

  • java 汉字处理_Java汉字处理

    1、字符串长度String s1 = "我是中国人";String s2 = "imchinese";String s3 = "im中国人";System.out.println(s1+":"+new String(s1).length());System.out.println(s2+":"+new String(s2).length());System.out.println(s3+":"+n...

  • Java中如何存储汉字

    Java中如何存储汉字 因为笔者了解有限,文中难免会出现一些错误,如有发现,望指出,谢谢。 依稀记得当初刷面试题时,有道题是这样的 char 型变量中能不能存贮一个中文汉字,为什么? 答:char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。 记得当时也很疑惑,只是学疏才浅,加上忙于找工作,也没多在意。直到无意间又遇到了这个问题,便一步一步踏上了

  • Java限制输入中文_iOS UITextField限制输入长度,处理中文输入法下的缺陷

    在很多情况下都会要求限制输入框的字数长度,在非中文情况下简单的处理下即可,但在系统自带的中文输入发现你会发现,即使输入拼音也会被限制。我们需要对中文输入法进行单独的设置:1.给UITextField绑定一个方法:[_summaryField addTarget:self action:@selector(editChange:) forControlEvents:UIControlEventEdi...

  • java代码产生汉字库

    java代码实现汉字库,编码方式有GB2312,GBK,Unicode,UTF-8,利用以上编码规则产生汉字库,目前是第一版本,只产生汉字库,第二版本实现随机汉字验证码,根据拼音检索匹配的汉字.

  • java 读取txt文件乱码

    private void msgTxt(){try {InputStreamReader isr = new InputStreamReader(new FileInputStream(&quot;文件路径&quot;), &quot;UTF-8&quot;); //设置为UTF-8BufferedReader br = new BufferedReader(isr);String s1 = null;while((s1 = br.r...

  • java汉字字节,Java一个汉字占几个字节(详解与原理)

    1、先说重点:不同的编码格式占字节数是不同的,UTF-8编码下一个中文所占字节也是不确定的,可能是2个、3个、4个字节;2、以下是源码:@Testpublic void test1() throws UnsupportedEncodingException {String a = "名";System.out.println("UTF-8编码长度:"+a.getBytes("UTF-8").len...

  • Java重写equals时应注意的问题汇总

    1 在改写equals时要遵守通用约定 2 改写equals时同时改写hashCode

  • java 汉字获取拼音全拼以及简拼

    package com.caiyun.pay.web.common.plugs; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; import net.sourceforge.pinyin4j.format.HanyuPinyinOu...

  • Java汉字按照拼音排序

    最近项目上使用到汉字排序的问题,网上搜索了一下后普遍使用下面的方法比较。   @Test public void test_sort_pinyin() { Collator cmp = Collator.getInstance(java.util.Locale.CHINA); String[] arr = { "张三", "李四", "王五", "赵六", "JAVA"

  • 详解Java中的异常(Error与Exception)

    《Java:详解Java中的异常(Error与Exception)》《Java:简述Java中的自定义异常》《Java:简述throw-throws异常抛出》《Java:简述try-catch-finally异常捕获》《Java:简述try-catch-finally中return返回》 一、 异常机制的概述 &nbsp; &nbsp; &nbsp; 异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制...

  • 01 26Java中级之异常的捕获及处理

    文章目录1 认识异常对程序的影响2 处理异常3 处理多个异常4 异常处理流程5 throws关键字6 throw关键字7 异常处理模型8 RuntimeException9 自定义异常类10 assert断言 1 认识异常对程序的影响 2 处理异常 3 处理多个异常 4 异常处理流程 5 throws关键字 6 throw关键字 7 异常处理模型 8 RuntimeException 9 自定义异...

  • java中equals的注意事项

    String currentName; "123".equals(currentName); currentName.equals("123") ; equals前面的数据必须是String类型的,而括号里面的测试Object类型的。 所以上面的第二种比较方法很危险,不注意就会出现错误。

  • java gb2312中文乱码_Java中文乱码问题(转)

    大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着大家,现把JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。首先了解一下Java中文问题的由来:Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。...

  • java判断中文汉字工具类

    package com.wlkj.util; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.sourceforge.pinyin4j.PinyinHelper; public class ChineseUtil { /** * 判断中文字符 * @param c * @re...

Global site tag (gtag.js) - Google Analytics