layout: post author: zoomq title: D码点评:12 自食 description: ~ 麻辣评点,善意满盈 categories: gDgcoDe tags: gdg D码点评 dd wechat coding


langs.png(PNG 图像,512x512 像素)

语言的quine接力

q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show 
c ++ [','] ++ show a ++ [')']main=q "q a b c=putStrLn $ b ++ 
[toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ 
[')']" "def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(
a)+')'" "def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+
10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end"

介什么东西呢?

这是一个Haskell程序源码,运行一下可以得到一个Python程序源码,再运行一下这个Python程序,可以得到一个Ruby程序源码,再运行一下这个Ruby程序可以得到最开始的Haskell程序源码. 这就是triple quine!!!

11门语言 Quine

后来: http://d.hatena.ne.jp/ku-ma-me/20090916/p1

# 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+"\"-- haskell"+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+"\"brainfuck"+l*64+"n++++++++[>++++<-]+++++++++>>
++++++++++"+l*31+"\"++(concat(snd(mapAccumL h 2(
"+l*31+"\"110"+l*31+"\"++g(length s)
++"+l*31+"\"22111211100111112021111102011112120012"+l*31+"\"++concatMap(
"+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+"\"2100211101012021122221121110100
0120211021120221102111000110120211202"+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=Nothing;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"

是这11门语言的quine:

卧槽. . . . HOLYFUCK!

mame/quine-relay

现在:

$ sudo apt-get install algol68g bash beef boo clisp clojure1.4 \
  coffeescript f2c fp-compiler g++ gauche gawk gcc gforth gfortran ghc \
  gnat gnu-smalltalk gobjc golang groovy icont intercal iverilog \
  jasmin-sable llvm lua5.2 make mono-devel mono-mcs nodejs ocaml octave \
  open-cobol openjdk-6-jdk parrot perl php5-cli pike7.8 python r-base \
  regina-rexx ruby1.9.3 scala swi-prolog tcc tcl8.5 ucblogo valac

然后就可以开始:

$ ruby QR.rb > QR.scala
$ scalac QR.scala && scala QR > QR.scm
$ $(SCHEME) QR.scm > QR.bash
$ bash QR.bash > QR.st
$ gst QR.st > QR.tcl
$ tclsh QR.tcl > QR.unl
$ ruby unlambda.rb QR.unl > QR.vala
$ valac QR.vala && ./QR > QR.v
$ iverilog -o QR QR.v && ./QR -vcd-none > QR.ws
$ ruby whitespace.rb QR.ws > qr.adb
$ gnatmake qr.adb && ./qr > QR.a68
$ a68g QR.a68 > QR.awk
$ awk -f QR.awk > QR.boo
$ booi QR.boo > QR.bf
$ beef QR.bf > QR.c
$ ${CC} -o QR QR.c && ./QR > QR.cpp
$ ${CXX} -o QR QR.cpp && ./QR > QR.cs
$ mcs QR.cs && mono QR.exe > QR.clj
$ clojure QR.clj > QR.cob
$ cobc -O2 -x QR.cob && ./QR > QR.coffee
$ coffee QR.coffee > QR.lisp
$ clisp QR.lisp > QR.fs
$ gforth QR.fs > QR.f
$ f2c QR.f && ${CC} -o QR QR.c -L/usr/lib -lf2c && ./QR > QR.f90
$ gfortran -o QR QR.f90 && ./QR > QR.go
$ go run QR.go > QR.groovy
$ groovy QR.groovy > QR.hs
$ runghc QR.hs > QR.icn
$ icont -s QR.icn && ./QR > QR.i
$ ick -bfO QR.i && ./QR > QR.j
$ jasmin QR.j && java QR > QR.java
$ javac QR.java && java QR > QR.ll
$ llvm-as QR.ll && lli QR.bc > QR.logo
$ logo QR.logo > QR.lua
$ lua QR.lua > QR.makefile
$ make -f QR.makefile > QR.il
$ ilasm QR.il && mono QR.exe > QR.js
$ $(NODE) QR.js > QR.m
$ gcc -o QR QR.m && ./QR > QR.ml
$ ocaml QR.ml > QR.octave
$ octave -qf QR.octave > QR.pasm
$ parrot QR.pasm > QR.pas
$ fpc QR.pas && ./QR > QR.pl
$ perl QR.pl > QR.php
$ php QR.php > QR.pike
$ pike QR.pike > QR.prolog
$ swipl -q -t qr -f QR.prolog > QR.py
$ python QR.py > QR.R
$ R --slave < QR.R > QR.rexx
$ rexx ./QR.rexx > QR2.rb

是的,50门开发语言的 Quine !!!

而且! 一切的开始,那段 Ruby 脚本本身是一幅 ASCIIART 的图标!!!

131119_quine-relay.png(PNG 图像,643x767 像素)

是也乎

一段程序的运行结果是打印自身的所有文本, 然后,一段程序运行的结果是打印出另外一种语言的代码,然后,再运行....

这么玩有意思嘛?! !

实现原理有讨论: Quine Relay是如何做到以字母顺序依次生成50种语言代码,最后回到原始程序代码的? - 知乎

而意义也早已有讨论: 打印自身的程序杂谈

而其实,最直接的原因仅仅是:

We use it just because we can, 
muggle!

太多事儿,不是必须知道有什么用,才进行的 ;-)

当期活动 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

珠海GDG[11.23]珠三角技术沙龙HOA.5

和久违的珠三角技术沙龙的小伙伴,共同来GDG 分享!

内容(可能):

  1. Jeff小乐队 PyCon2013China 开场曲目内部练习
  2. iFanr 编辑一斌 有关跨界成长的体验
  3. 北理工学生有关 TI SensorTag 试玩体验
  4. Leo ~ 文学化编程再再再谈
  5. AngularJS 现教现用
  6. Web的未来-新语言和新技术
  7. GLASS生态...

其它征集中...

筹备活动 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

PyCon2013CHina 珠海场

请及时举报你身边的 华蠎行者! 举报热线: zoomquiet+pycon (AT) gmail.com



以上...


码不停提马上无虫 ;-)

|_|0|_|
|_|_|0|
|0|0|0|

加入 珠海GDG

  1. 注册 G+
  2. 关注 GDG Zhuhai
  3. 成为 GDG Zhuha开发者

通过 珠海GDG 可以:

    第一时间获知谷歌最新的技术,
    可以学到如何去谷歌平台上赚钱的思路和方法,
    可以认识很多有可能将来一起走上自己创业道路的人,
    可以学会把你的创新带向国际市场,
    参加那里的活动有经常和国际上的开发者们进行交流的机会...

PS:

若无意外,题图都是从原文提取或是通过 Google 图片搜索出来的, 版权属左, 不负责任 ;-)

PPS:

珠海GDG wechat/Blog 都是欢迎投稿的,只要追认内容吻合以下条件:

0. 有趣 ~ 至少是自个儿有兴趣的领域吧...
1. 有料 ~ 至少有点儿原创的东西吧..
2. 有种 ~ 至少不能是成功学吧!

有好物的,及时向大妈们吼: [email protected]

微信栏目

当前应该是:

    G术图书 (gb:推荐好书,书无中外)
    D码点评 (dd:麻辣评点,善意满盈)
    G说公论 (gt:时评杂文,新旧不拘)
    珠的自白(dm:大妈自述,每周一篇)
    海选文章(hd:得要相信,大妈法眼)

总之! 珠海的组委大妈们,决定开始坚持发文,方方面面细细同大家分享/交流

总之! 请大家告诉大家, 珠海生活中的技术社区 已经认真回归 微信,都来订阅吧!

订阅方法

GDG珠海 社区资源:


Author: Zoom.Quiet /mail / gittip / github