まえがき
新年あけましておめでとうございます。あまりにも寒すぎて、布団がもう一枚欲しくなる季節ですが、如何お過ごしでしょうか。
新年になるとよく交換されるものとして年賀状があります。今年はプログラマブルな年賀状のアイディアが突然舞いおりたので、いままでと趣旨を変えて、それを作って送ったのですが、よくよく考えると、これ見て喜べるのって、理解できる人だけなんじゃないかなというか、わからなかったらただの年間違ってんじゃないか?みたいなものだったので、今では反省してます。後悔はしていないので、公開もします。
年賀状
見てわかる通り申
のAAである。これだけ見たら、完全に去年用の年賀状じゃんかと言われかねないが、この文字列はもちろん適当に並べているわけではなくて、ちゃんと意味のあるものなのである。
Quine
クワイン(英: Quine)は、コンピュータプログラムの一種で、自身のソースコードと完全に同じ文字列を出力するプログラムである。 クワイン (プログラミング) - Wikipedia
それをAAにしたり、色々な工夫を凝らしたりする文化がある。 以下のような本もあったりしてめっちゃ面白い。
年賀状の文字列もこのQuineになっていて、実行するとその真の力を現わすようになっている。
実行結果
Before
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