More info...

2011-02-22

ついカッとなってQuine生成ツールをこしらえた

心のこもったメッセージを伝えたい。そんなとき、少し趣向をこらしてみようと思うのが人情というものだろう。ギークらしさを演出しつつ、ちょっと凝ったメッセージ。ならQuine(クワイン)がいいんじゃね!?と思い立って急遽ツールを作成した。作成方法などはRubyでうどんげQuine(とAA型Quineの作り方講座)を参照させて頂いたので特にロジックを考える必要はなかったのだが、せっかくなのでQuineの生成を自動化すると面白いかなと思ったのであった。

ダウンロードはこちらから。

Quine Tools @ GitHub(仮)


興味があれば遊んでみて欲しい。言語はRuby。入力にはUTF-8を想定しているので、ロケールがUTF-8じゃない人は適宜ソースをいじって頂きたい。

Quine Toolsには次の2つのプログラムが含まれている。

  • jbanner.rb ... 日本語のbannerを表示するプログラム。BDF(ビットマップフォント)対応。
  • quine-gen.rb ... bannerの入力を元にQuineを生成するツール。

この2つを組み合わせて次のように使う。

shell> jbanner.rb -f shnmk16b.bdf 自由 主義 | quine-gen.rb -s 2 | ruby | ruby
eval$s=%w'                                                                        
                                                                        
                                                                        
                                                                        
              requ                              ire"                    
              base                              64";                    
              requ                              ire"                    
              zlib                              ";b=                    
            "eJz                                tlv0                    
            KgzA                                MxP/                    
      f0+j7v9xWRlhSmw/1SMK2A0X                  a89c                    
      mp9Bt66VHM47U/tJ5x3Ev38n                  xKVm                    
      cXVE                lx3p        DW+ftqOHoo7/BsXKv4Hh1oXJHc        
      VB1R                TmoP        qM43frz59gcL3fdgefcE5LTbU9        
      Sq/z                Xs/z        57Pk      nzom        SpCu        
      fo3+                Hw43        m2C5      /JTT        Hr8v        
      +kys                4liO        bY+U      wlM2        ZieQ        
      iJ55                jpSr        n+Wr      H3FG        cWF0        
      zh5TNQeWO4qzmeKcrOZQ+3cd        4Nof      3dHZ        ezUv        
      neKmu1vhUNy4sJyreYclDcnq        fx+r      1BHO        p4qo        
      =";n                =Zli        b::Inflate.inflate(Base64.        
      deco                de64        (b));e=$s*5;o="eval$s=%w"<        
      <39;                j=-1        ;0.u      pto(        72*7        
      5-1)                {|i|        o<<(      (n[i        ]=="        
      1"[0])?e[j+=1]:32);o<<((        i%72      ==71        )?10        
      :"")};o[-10,6]=""<<39<<"        .joi      n";p        uts(        
      o)#r                equi        re"b      ase6        4";r        
      equi                re"z        lib"      ;b="        eJzt        
      lv0K                gzAM        xP/f      0+j7        v9xW        
      RlhS                mw/1        SMK2      A0Xa        89cm        
      p9Bt                66VH        M47U      /tJ5        x3Ev        
      38nx                KVmc        XVEl      x3pD        W+ft        
      qOHoo7/BsXKv4Hh1oXJHcVB1        RTmoPqM43frz59gcL3fdgefcE5        
      LTbU9Sq/zXs/z57PknzomSpC        ufo3+Hw43m2C5/JTTHr8v+kys4        
                                                                        
                                                                        
                                                                        
                                                                        
              liOb                          Y+Uw        lM2Z            
              ieQi                          J55j        pSrn            
                +WrH                          3FGc    WF0z              
                h5TN                          QeWO    4qzm              
                eKcr                  OZQ+3cd4Nof3dHZezUvneKmu1vhU      
                Ny4s                  JyreYclDcnqfx+r1BHOp4qo=";n=      
    Zlib::Inflate.inflate(Base64                  .dec                  
    ode64(b));e=$s*5;o="eval$s=%                  w"<<                  
                39;j                    =-1;0.upto(72*75-1){|i|o        
                <<((                    n[i]=="1"[0])?e[j+=1]:32        
                );o<                              <((i                  
                %72=                              =71)                  
                ?10:                "")};o[-10,6]=""<<39<<".join";pu    
                ts(o                )#require"base64";require"zlib";    
                b="e                          Jztlv0  KgzA  Mx          
                P/f0                          +j7v9x  WRlh  Sm          
      w/1SMK2A0Xa89cmp9Bt66VHM        47U/tJ5x3E      v38n  xKVm        
      cXVElx3pDW+ftqOHoo7/BsXK        v4Hh1oXJHc      VB1R  TmoP        
                qM43                        frz5      9gcL              
                3fdg                        efcE      5LTb              
                U9Sq                /zXs/z57PknzomSpCufo3+Hw43m2C5/J    
                TTHr                8v+kys4liObY+UwlM2ZieQiJ55jpSrn+    
                WrH3                        FGcW        F0zh  5TNQ      
                eWO4                        qzme        KcrO  ZQ+3      
                cd4N                        of3dHZezUv  neKm  u1        
                vhUN                        y4sJyreYcl  Dcnq  fx        
                +r1B                HOp4qo=";n=Z          lib:  :Inf    
                late                .inflate(Bas          e64.  deco    
  de64(b));e=$s*5;o="eval$s=%w"<<3          9;j=      -1;0.u  pt  o(    
  72*75-1){|i|o<<((n[i]=="1"[0])?e          [j+=      1]:32)  ;o  <<    
                                          ((i%72  ==71)?      10:"")    
                                          };o[-1  0,6]="      "<<39<    
                                                                        
                                                                        
                                                                        
                                                                        
                                                               '.join
空白で改行が入るのは仕様だ。気に入らなかったら直して欲しい。

なぜ標準入力をrubyへ2回つないでるかというのは、Quineとしてちゃんと機能しているかどうかを確かめるため。ちなみに、bannerの文字数が少ないとQuine全体をプログラム中に埋め込むことが出来ずにエラーになってしまうので、メッセージを長くする必要があるのだが、どうしても短いものを表示したい場合にはquine-gen.rbの-sオプションを使って倍率を指定すると良い。

また、jbanner.rbはBDFファイルをオプションで指定する必要があるのだが、BDFファイルはこのページなどから入手可能である。上記の例では「東雲16ドットフォント」をありがたく利用させて頂いた。

jbanner.rbは半角文字には対応していないので、アルファベットなどを使いたい場合には通常のbannerコマンドと組み合わせるといいようになっている。

shell> banner Ruby de Quine | quine-gen.rb -s 2 | ruby | ruby
eval$s=%w'                                                                                  
                                                                                  
require"base                                                                      
64";require"                                                                      
zl          ib    ";        b=    "eJztllEOg        CA      Ih                    
t8          7j    d3        /c    q05FyDkFqC        /W      zy                    
R0          qe    AI        qX    gy        0n        kg  CV                      
K/          Rl    p3        03    kP        /o        e1  hB                      
721uzopRBlF6      Nv        a6    jVh4ziDqHE            vu                        
ZNUSbjUSkTJ6      pb        5m    JI8ZUh5/YR            95                        
fg      zO        IX        PO    /D        jO          I3                        
pd      sB        nG        HO    CI        S0          e/                        
Mb        rU      ni        h5    NH        Hd          SU                        
rd        vb      d0        TB    pH        3C          jJ                        
aG          ER      uKTObR5R      270Rur3sdT            7S                        
7P          dt      uFpH2dnq      3Z6+jn/B44            h7                        
                                                                                  
                                                                                  
                                                                                  
                                                                                  
  1EV8uBj8bX      g==";n=Zlib:                                                    
  :Inflate.i      nflate(Base6                                                    
  4.        de    co                                                              
  de        64    (b                                                              
  ))        ;e    =$s*5;o="e                                                      
  va        l$    s=%w"<<39;                                                      
  j=        -1    ;0                                                              
  .u        pt    o(                                                              
  82        *5    3-                                                              
  1)        {|    i|                                                              
  o<<((n[i]=      ="1"[0])?e[j                                                    
  +=1]:32);o      <<((i%82==81                                                    
                                                                                  
                                                                                  
  )?10:"")};                                                                      
  o[-10,6]="                                                                      
"<          <3    9<        <"          .j        oi        n"    ;puts(o)#req    
ui          re    "b        as          e6        4"        ;r    equire"zlib"    
;b          ="    eJ        zt          ll        EOgC      AI    ht              
87          jd    3/        cq          05        FyDk      Fq    C/              
Wz          yR    0q        eA          Iq        Xg  y0    nk    gCVK/Rlp30      
3k          P/    oe        1h          B7        21  uz    op    RBlF6Nva6j      
Vh      4z  iD    qH        Ev          uZ        NU    Sb  jU    Sk              
TJ      6p  b5    mJ        I8          ZU        h5    /Y  R9    5f              
gz        OI      XP        O/          Dj        OI      3pds    Bn              
GH        OC      IS        0e          /M        br      Unih    5N              
  HHdSUrdv  bd      0TBpH3Cj            Ja        GE        Ru    KTObR5R270Ru    
  r3sdT7S7  Pd      tuFpH2dn            q3        Z6        +j    n/B44h71EV8u    
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                         '.join

Enjoy!!

0 件のコメント:

コメントを投稿