つらねの日記

プログラムの進捗やゲームをプレイした感想などを書き連ねる日記。

新年とRubyとQuine

まえがき

新年あけましておめでとうございます。あまりにも寒すぎて、布団がもう一枚欲しくなる季節ですが、如何お過ごしでしょうか。

新年になるとよく交換されるものとして年賀状があります。今年はプログラマブルな年賀状のアイディアが突然舞いおりたので、いままでと趣旨を変えて、それを作って送ったのですが、よくよく考えると、これ見て喜べるのって、理解できる人だけなんじゃないかなというか、わからなかったらただの年間違ってんじゃないか?みたいなものだったので、今では反省してます。後悔はしていないので、公開もします。

年賀状

f:id:turane_gaku:20170102223357j:plain

見てわかる通りのAAである。これだけ見たら、完全に去年用の年賀状じゃんかと言われかねないが、この文字列はもちろん適当に並べているわけではなくて、ちゃんと意味のあるものなのである。

Quine

クワイン(英: Quine)は、コンピュータプログラムの一種で、自身のソースコードと完全に同じ文字列を出力するプログラムである。 クワイン (プログラミング) - Wikipedia

それをAAにしたり、色々な工夫を凝らしたりする文化がある。 以下のような本もあったりしてめっちゃ面白い。

mame.github.io

年賀状の文字列もこのQuineになっていて、実行するとその真の力を現わすようになっている。

実行結果

Before

gist.github.com

After

$ ruby nenga2016.rb
eval$s=%w(y=""<<32;c=y*2+"###(
c)"+y+"ghenar_tnxh".tr("a-z","
n-za-m")+y+"1k1".to_i(36).to_s
          +"      ##
          #"      ;o
  ="";j=-1;e="eval$s=%w("+($
  s*7);"000ov3ov3cn5cn5ijhij
  hi      jh      cz      xi
  y9      iy      lc      n5
  cn      5i      yl      iy
  lc    n5cn      5".scan(/0
  |.{3}/                  ){
  |n                      |q
  ="";0.upto(14){|i|2.times{
  q<<(n.to_i(36)[i]>0?y:e[j+
  =1                      ])
  };                      };
  o<<q.rstrip<<10};o[-7,6]="
  ).join";o<<c;puts(o)).join
  ###(c) turane_gaku 2017###

なんということでしょう。過去のものとなったは消えさり、新たにが現われました。

このを実行すると、に戻ったりはせずに、を生成する。時間は常に一方方向にしか流れないのだ。

あとがき

年賀状を印刷してから、shebangを上に書けば良かったなぁと思いました。 あと、年賀状を送った人達のなかで、Rubyを知らない人にはすまない、本当にすまない。

Quineを作るに当っては、ここがめっちゃわかりやすかった。初心者にも優しい。超絶技巧のソースコードは完全に超絶技巧すぎて辛かった。 d.hatena.ne.jp