博客从打印源程序开始: Quine

很早就听说过Quine,然而从来没动手写过一个。最近因为写完了论文,又搞定了签证,堕落到“蛋疼”,所以来玩一下。

 

简单的来说,quine就是写一个程序,然后这个程序的输出就是程序的源代码自身(self-replicating programs, self-reproducing programs)。

 

 

思路:

[code a] print str = "[code a]  print str = @@ [code b]" [code b]

其中code a是任意的程序a,code b类似; print是打印函数;str 是一个字符串,字符串里@@表示"字符串本身"。code a, b不会调用print函数;print函数用来打印字符串str:首先打印code a,然后打印print语句自身,然后打印字符串,然后打印code b。

 

蛋疼的coding开始了,语言用的c++,程序如下:

  

 

程序中PrintData用来打印这个字符串,因为C++的转义符很麻烦,所以这里有额外的处理。main函数里面首先定义字符串str,然后是一个for语句用来打印这个整个源程序,当遇到@@的时候调用PrintData函数来打印字符串str本身。

 

因为涉及c的字符转义,所以非常的“蛋疼”,上网搜了一下,更有达人,把字符串的每个字符写成ASCII码!

 

当然,这个世界上天才很多,下面是有史以来最简单的用c表示的quine程序:

 

 

程序很简单,首先省去stdio.h的include,然后省去main的返回值。main函数里,首先定义字符串s,注意这里有%c%s%c作为待定参数,因为s=后面有引号。%s的位置用来接受字符串本身,非常聪明!!例外,它也不涉及转义,因为用ASCII码34表示引号。

 

神一般的quine in c!

 

 

 

不过,还有更神的quine!

 

第一个:世界地图

 

这个ruby程序不但会打印自身,而且中间的这个世界地图,会向右旋转!不信你把他保存为rb文件,然后运行50次看看。

 

 

第二个:多语言自身复制循环 (转载自:http://d.hatena.ne.jp/ku-ma-me/20090916/p1)

 

这个程序运行以下的命令,又变成自身的了!这些命令首先是ruby转python,再转perl,再转lua,再转ocaml,再转ghc,再转c,再转java,再转beef,再转whitespace,再转unlamba……

 

 

 

其中各解释器/编译器的版本是:

欢迎“蛋疼者”测试验证。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值