阅读更多
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 彩虹字的代码

    java 彩虹字 java 彩虹字 java 彩虹字 java 彩虹字

  • 刨析 equals 比较 漏洞与误区

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

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

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

  • Java中汉字问题的分析及解决

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

  • java异常 — — 异常的处理

    二、异常的处理 Java异常处理的五个关键字: try、catch、finally、throw、throws 2.1、抛出异常throw 在编写程序时,我们必须要考虑程序出现问题的情况。比如,在定义方法时,方法需要接受参数。那么,当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不台法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者。 在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。 抛出异常后: ① 创建一个异常对象。封装一些提示

  • 关于Eclipse中无法输入汉字的解决

    关于Eclipse中无法输入汉字的解决 该问题解决方式也很简单 只需在编辑器中 Ctrl+Shift+E 就行。

  • eclipse汉字太小解决办法

    eclipse使用过程中发现汉字太小,几乎不可辨识。 更改办法:eclipse界面依次选择“window”–“preference”–“general”–“appearance”–“color and font”–“basic”–“text font”将字体从原来的默认改为“courier new”字体。如果在字体栏中找不到,就点击左下角”显示更多字体“–到控制面板\外观\字体界面,找到couri

  • Java 中文报错的解决方法

    无法识别中文字符: 一个中文占两个字符,所以报了四个错 解决方法: 方法一、脚本转化编码 https://blog.csdn.net/weixin_43673589/article/details/109774579 方法二、记事本另存修改编码 用记事本打开,另存为,下方可以选择保存编码 ANSI编码其实是ASCII码的升级版,只能显示英文,不能显示中文 要显示中文,必须改为UTF-8 修改之后就可以正常编译运行了 ...

  • java后端限制输入的名字的汉字长度

    最近在项目开发中,遇到一个情况,限制前端传过来的参数输入汉字的长度思路:将前端传过来的名字参数转换为字节数组 实际代码如下:try {    logger.info(&quot;持卡人姓名&quot;+userbankcard.getName()+&quot;持卡人姓名转换为数组长度&quot;+namelength);    if(userbankcard.getName().getBytes(&quot;GBK&quot;).length&amp;gt;12)...

  • Java编程中汉字问题的分析及解决

    引:在基于Java语言的编程中,我们经常碰到汉字的处理及显示的问题。一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够让那些汉字正确显示呢?Java语言默认的编码方式是UNICODE,而我们中国人通常使用的文件和数据库都  在基于java语言的编程中,我们经常碰到汉字的处理及显示的问题。一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够让那些汉字正确显示呢?Java语言默认

  • java中equals的注意事项

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

  • JAVA中的汉字编码问题

    一、常见的字符编码 计算机中存储、处理和传送的数据是二进制的形式。各种文字、符号也必须用二进制数编码来表示,因此出现了一些不同形式的字符编码。 1.ASCII码 ASCII码是美国标准信息交换代码(American Standard Code for Information Interchange),是微机中最常采用的编码。ASCII有7位码和8位码两种版本。国际通用的7位ASCII码是用7位

  • 计算机编程技术之堆排序的分析与实现

    计算机编程技术之堆排序的分析与实现排序就是将一系列无序的数据按某个关键字进行有序化。我们最常见的排序基本上都是将数字按递减或者递增关系进行排序。比较主流的排序方法有8种,分别是冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、二叉排序和计数排序。排序算法的不同,导致了各种方法的性能指标不同。排序的性能指标主要有算法的复杂性和稳定性。排序算法的稳定性是指在待排序的序列中,存在多个相同的元素...

  • 中文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