阅读更多
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中文编码小结1.只有 字符到字节 或者字节到字符 的转换才存在编码转码;2. Java String 采用 UTF-16 编码方式存储所有字符。unicode体系采用唯一的码点表示唯一的字符信息, 码点的存储方式有UFT-16、UTF-8 等等。: AStringrepresents a string in the UTF-16 format in whichsupplementary...

  • Java输出windows中的全部汉字

    Java输出windows中的全部汉字 1、简介 本篇博客向大家展示一个小程序,即通过Java编程输出Windows中的全部汉字,并将这些汉字存入程序所在路径的txt文件中。 2、实现过程 1)对于Java中文件的操作可以参考工程训练中的任务2.1进行学习,本部分需要使用到文件的写入,在java中可以通过BufferedWriter或FileWriter对文件进行写入操作,在使用Buf...

  • java实现汉字字典

    环境:eclipsse, jdk1.6, 没有使用第三方的包,都是JDK有的。 注意,项目源文件我都使用的是UTF-8的编码格式,如果不是,代码里面的汉字注释会显示乱码。 设置UTF-8:windows->Preferences->General->Workspace 页面上Text file encoding,选择Other UTF-8 项目结构: 1

  • 字符编解码的故事(ASCII,ANSI,Unicode,Utf-8区别)

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们认为8个开关状态作为原子单位很好,于是他们把这称为"字节"。再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出更多的状态,状态开始变来变去。他们看到这样是好的,于是它们就这机器称为"计算机"。开始计算机只在美国用。八位的字节一共可以组合出256(2的8次...

  • java 中判断某个字是否是汉字

    java 如何判断一个字符是否是汉字

  • JAVA中文字符编码问题详解

    JAVA中文字符编码问题详解    JAVA的中文字符乱码问题一直很让人头疼。特别是在WEB应用中。网上的分析文章和解决方案都很多,但总是针对某些特定情况的。很多次遇到乱码问题后,经过极为辛苦的调试和搜索资料后终于解决,满以为自己已经掌握了对付这些字符乱码怪兽的诀窍。可当过段时间,换了个应用或换了个环境,又会碰到那讨厌的火星文,并再次无所适从。于是下决心好好整理一下中文字符编码问题,以方便自己

  • java 汉字乱码_Java中文乱码问题

    一、MyEclipse 下的java文件中文乱码问题(MyEclipse6.5):解决方法一:Window--àPreferences… --àGeneral --àContent Types --àText --àJava Source File 中Default encoding 改写成UTF-8(你所需的编码类型) 然后Update,OK确定就可以了。二、1 、编码编码比较常用的有:UTF-...

  • 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 语言的编程中,我们经常碰到汉字的处理及显示的问题。一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够让那些汉字正确显示呢?Java语言默认的编码方式是UNICODE,而我们中国人通常使用的文件和数据库都是基于GB2312或者BIG5等方式编码的,怎样才能够恰当地选择汉字编码方式并正确地处理汉字的编码呢?本文将从汉字编码的常识入手,结合Java编程实例,分析以上两个问题并

  • java 字符和汉字比较_Java比较汉字字符串排序与C++比较汉字排序

    一、Java比较汉字// Collator 类是用来执行区分语言环境的 String 比较的,这里选择使用CHINAComparator cmp = Collator.getInstance(java.util.Locale.CHINA);TreeMap tree=new TreeMap(cmp);String[] arr = {"张三", "李四", "王五"};// 使根据指定比较器产生的顺序...

  • Java中文编程开发,让Java编写更加容易

    Java中文编程开发,让Java编写更加容易目录 创建Java项目 创建类 编写方法 调用方法 Tips:文件必须以UTF-8格式保存才能够运行1.创建Java项目项目创建完成后,创建一个资源包: 2.创建类3.编写方法package 我的包;public class 中文编程 { public int 文本转数字(String 数字文本){ return Integer.parse

  • 中文java_java中文编程

    Java的中文问题历史悠久,连绵不绝,至今也没有完全解决,但是上有政策下有对策,我们总是有办法搞定它的。跟Java相关的中文问题主要有两 类,一类是编程的问题,涉及到I/O,内码转换等。第二类是Java运行环境的配置,涉及字体,属性配置等。我刚刚用了一天的时间解决这些问题,觉得很有 必要给自己写个备忘录之类的。我看还是从问题入手吧,这样不致于让大家打瞌睡。我想写个程序,这个程序有个基本功能就是显示...

  • java中文编程_Java中文编程开发

    如图,代码在后面 代码如下:支持多种写法package util;/*** Java中文编程* @author Online zuozuo**/public class 牛 {public static void main(String[] args) {牛 小牛 = new 牛();小牛.变成公牛();小牛.变成母牛();小牛.有牛逼的吗();小牛.¥();}public void 变成公牛()...

  • java怎么控制台输出汉字报错,才开始自学java,控制台打印输出中文会出错?报错提示看不懂,请童鞋们帮解答。...

    D:\code\zuoye&gt;javac PersonalInfo.javaPersonalInfo.java:6: 错误: 编码GBK的不可映射字符System.out.println("浣忓潃锛氶暱娌欏竞鑺欒搲鍖哄彜镟茶矾涓?鍙蜂竴鍗曞厓001");^1 个错误D:\code\zuoye&gt;javac PersonalInfo.javaPersonalInfo.java:6: 错误: ...

  • 编程书籍大全

    MFC程序开发参考大全USB应用开发技术大全HTML参考大全Java范例开发大全Java开发技术大全Java 2参考大全Java Web开发典型模块大全Java Web开发技术大全精通Java Web整合开发Java 2游戏设计Java游戏编程Java Web开发实战1200例Java Web 2.0架构开发与项目实战开发者突击Java Web 开发详解 XML+XSLT+Servlet+JS...

Global site tag (gtag.js) - Google Analytics