読者です 読者をやめる 読者になる 読者になる

TRICK 2013

https://github.com/tric/trick2013

https://sites.google.com/site/trickcontest2013/home/ja

大変楽しく審査員をやらせてもらいました。いろいろ思ったことがあるので、いろいろ適当に書いていこうかと思います。

作品評

ざっくり僕が良いと思ったやつから順に書いていこうかと思います。

https://github.com/tric/trick2013/blob/master/usak/entry.rb

$ruby.is_a?(Object){|oriented| language}

これだけ短いコードに色々言えることがあってすごく良かったです。 is_a? Object と identifier じゃない ruby の構成要素が 2/5 という割合で入ってるのも良いし、ブロックを取らないメソッドにブロックを渡して良いというのも知らなかった(あるいは忘れていた)ですし、 is_a? なんていう(私の中では)マイナーなメソッドが使われてるのもいい。 remarks で is_an? が無いのは仕様バグとか言うのも面白い。まぁ rubypython と違って英語文法にこだわらないのは好きなところで、 python の endswith とか 'og' in 'hoge' とか、あと X if cond else Y とかあまり好きでないです。

なにより感銘を受けたのはこの文が true として評価されることで、 ruby is a(n) object oriented language 、という、ほとんどの人が真だと考えることを ruby も真だと思う、ってのはすごくいい。ていうかこれは remarks に是非書いておいて欲しかったと思う。

というわけで10点を入れさせてもらいました。みんながこのコードをすごく気に入るかっていうとそうでもないかな、と思ってたら案の定票が割れて思ったより順位は上じゃなかったです。

あと remarks の文体からこれは間違いなくコミッタで、たぶん usa さんなのかな、と思ったらそうでした。評価をして次の日くらいに、あれでもアレって見たことあった気もするな…と思って、 remarks をちゃんと読んだりしてたら既出と書いてあって、ああやはりそうか、と。思い出してみると同じコードに感動した記憶があるので、ブロック取らないメソッドがブロック取れる、なども完全に忘れていた模様。

https://github.com/tric/trick2013/blob/master/kinaba/entry.rb

kinaba さんのやつ。これはなんか満場一致な感じで優勝しました。私も同じようなコードを今回のために書こうとしていて、イマイチ綺麗な感じにならなかったので提出を諦めたということもあり、色々な点で私のやろうとしてたことよりうまくやっていて、参ったなという感じ。

自分でやってみたからわかるんですが、この主題でやるととにかくアルファベットが余る。この点をあまりに有名な pangram quick brown fox で捨てる、っていうのは、ずるくもあるけれど、プログラムの説明にもなって、大変スマートな回避策と言えます。あと出力がプログラムに使った文字全部、っていうのもこのサイズのプログラムでやるにはちょうどいい課題で、かつ気も効いててすばらしい。というわけで10点。

このコードはぱっと見からしてゴルファーが書きそうなコードで、ゴルフやったこと無い人とは思えないな、と思いました。参加したぽいことを twitter に書いてたから、 kinaba さんあたりだと面白いな、とか思ってたら本当に kinaba さんでびっくりしました。 mame さんかもなぁともチラっと思ったりもしました。

https://github.com/tric/trick2013/blob/master/yoshi-taka/entry.rb

UTF8 。これは9点。出力の意味がよくわからなかったこともあり、私の予想に反して審査が割れて、全体としての評価はあまり良くなかったですが、これはよく見ると様々な嫌がらせがなされていて大変良いコードでした。解析に一番時間がかかったエントリーだったと思います。途中でエディタだけで解析するのを諦めて、 hexdump 使ったり ruby で UTF8 文字列をいくつか置き換えたりして、やっと全貌がつかめました。

印象に残ったイヤガラセとしては

  • 4で割って3あまる数 % を並べたら syntax error にならない
  • 見えない文字がメソッド名になってる
  • 途中で RTL になってるせいで読めないどころか編集も困難 (ちなみに RTL LTR 切り替え文字は文字列の中にしか無くて、 identifier としては使われてなかったと思うんですが identifier に入れた方が良かった気がしました)
  • 21 行目に唐突に存在する exit を飛び越えれてるのはどういう UTF8 マジックなんだ…とかなり考えた結果、ヒアドキュメントかよ! っていう騙し討ち
  • その前の意味ありげな ruby code のほとんど意味がなくて、但し一番最初の 5 だけは意味を持ってる
  • 最後の最後で % の個数は4で割って3あまる…の条件を満たさない一個浮いた %

などなど。ヒアドキュメントや最後の % など、同じネタかな、と思ったら違うネタというのがあれこれあって、解読してて大変楽しかった。 eban さんがおっしゃっていた、審査員が試されてる感がありました。

出力の方も後で聞くと合成文字で巨大な1文字を合成してるとのこと。今よく見ると remarks にそう書いてあるんですね。平易な日本語で書いてもらった方が(低くつけた人の)評価高かったかも。

https://github.com/tric/trick2013/blob/master/yhara1/entry.rb

https://github.com/tric/trick2013/blob/master/yhara2/entry.rb

yhara 作品 * 2 。両方8点。どっちも小粋な感じでよかったです。ただ1点ずつ気にいらない点がありまして。

前者の色んな文字をどっかから取ってくるのは頑張って探したねーという感じで良かったんですが、これ取ってきた文字を最初だけは5番目のを取ってくるとか、 String 、 Class 、例外で分岐したりとか、後調整が少し多いなと。特に upcase しちゃってるのが個人的に残念。ただそのへんが実際に回避できるかはわかってないです。

ruby ruby ruby の方は、真ん中の方にある定数列が残念すぎでした。一つ目の ruby だけの配列は Rubyruby しか使われてなくて、これは 1bit しか情報無いから任意文字列埋めるのは無理なわけですけど、ここに下の配列と同じく 4bit 情報を持たせれば数字だけの配列はいらなかったはず…と思います、たぶん。

そろそろ飽きてきたので順番を適当にします。

https://github.com/tric/trick2013/blob/master/mame1/entry.rb

https://github.com/tric/trick2013/blob/master/mame2/entry.rb

mame quine 2つ。見慣れたとはいえいいものはいいので、飽きたとかいう評価はあまり好きでないんですが、私としては副作用のある quine ってのは一度書いたことある人にはすごく簡単だと主張したい。実際方法が確立されてる言語での quine てのはまぁ簡単に書けるんです、めんどくさいのと、サイズ制限があるからゴルフ力が要求されますけど。

とはいえ前者は7点と高めの点数をつけまして、これはデータの持ちかたがうまいというのが良かったです。絵にも見えるけど、実際は音データ、というのはよくできている。後者と比べるとよくわかるんですけど、後者は最後のところに明らかに ruby でないぐちゃっとしたデータが入っていて、こういう感じで見た目が大変悪くなってしまうんだけど、前者ではそういう部分が無い。

後者は正直 -i の abuse ってのは面白いと思うんで、 quine にせずそっちに focus してもらった方が小粋な感じで良かったなぁとか思ったりしてました。 cheat OCR ってどういう感じだろーと頑張って読んでみたのに、なんだフォントデータ使い回してるだけかーていうのも残念でした。もう少し変更に強かったら私的には(全体の評価は変わらないでしょうけど)面白かったんですけど。

ちなみに前者は私と同着だったんですけど、 mame さんに2位をゆずっていただきました。まぁ正直他の作品になら私の方がゆずったと思うんですけど、 mame さんの quine なら私がもらっちゃっていいかなと思ったというのが正直なところでした。

https://github.com/tric/trick2013/blob/master/nari/entry.rb

nari さんの ObjectSpace abuse 。最初はわくわくしたんですが、 ObjectSpace.each_object に Cell を渡してるのが残念で、これじゃあ普通の BF interpreter に見えちゃうなぁと、私的にはかなり低い評価になっちゃいました。これが Cell 以外のものも次々と来てしまう普通の each_object で、いらない情報を単純な if とかじゃない方法でうまいこと捨ててたりしたら面白かったなぁと思いました。

https://github.com/tric/trick2013/blob/master/baban/entry.rb

baban さんの alice in wonderland 。これは割と満場一致で _tired とか動詞の検出が残念という感じでした。とはいえ、 method_missing で文章出力、ってのは結構あるネタだけど、これだけ長い文章をゴマかしたのは偉いと思いました。 that._; nor.did のあたりは苦労がしのばれて良い部分でもあるんですが、出力がちょっと残念でした。

審査の仕方と、審査員団

というように、私は完全に全てを理解したとはいえないものの、結構細かいとこに難癖をつけてみたり誉めてみたりする感じで見てましてました。これは私自身がこういう気持ち悪いコードを書くのが好きだから細かいところの完全性というか、誰も見ないような細部にこだわる美学みたいなことが気になるということがあると思います。

で、私みたいなのもいていいと思うんですけど、やはり mame さんの quine の視覚的なインパクトは強いわけで、そういうとこも拾いたかった。そうでないと例えば私と mame さんだけが審査員だったりすると、そういうところばっか見て「オタクのこの重箱の隅すばらしいですなー」みたいなキモいコンテストになっちゃうかもなーということで、もう少しライトな視点から見てくれる人も欲しいな、ということで色んなとこから審査員を集めてみたということがあります。これはかなり期待通りにいったような気がします。僕の感覚では yhara さん matz さん eto さんがそういうところを結構拾ってくれた印象 (yhara さんはライト扱いされると不服かもですが)。ただ、なんか予想以上にみんなちゃんとコード読んで審査してくれたなー感もありますが。

そういう意味でも豪華な感じの審査員を集められたのは良かったなぁと。みなさんおいそがしいとこ、わけのわからんことを引き受けていただけて大変うれしかったです。

ちなみにこういうコンテストをやるという話になった時に思い出したのは、鉄鍋のジャンというマンガに出てきた料理審査員団で、なんか料理のコンテストなのに「俺は栄養価しか評価しないから食べないよ」とか「私は見た目だけ」、「私は香りだけで評価するわよー」みたいなノリで、なんかムチャクチャな連中でした。というわけでそんなイメージもあり色んなとこから審査員を拾って来たり拾ってもらったりしたという。 ruby パパ枠 matz さん、アーティスト枠 eto さん、外人枠 leonid さん、あたりは特にそういう diversity を確保したかった感じで。

自分のエントリ

https://github.com/tric/trick2013/blob/master/shinh/entry.rb

これは10-30時間ほど他2つの大作チックな無理ゲーをがんばった後で、うーんこのコンセプトは無理だーと思って書いたコードで、実は10-20分くらいしか使ってない小品だったりします。ただぱっと見の全然プログラムに見えない感と、レイアウトの綺麗さ、実行されないコードを使って for を使って you と program を nil にするあたりが良かったのか、思ったよりはるかに良い点数をもらいました。

書いてて考えてたのは、まず発表の中でも言ったのですが、なんか賢いことを言ってるようで何も言ってない、どうでもいい文を目指したということはあります。

あとはまぁレイアウトですね。 yhara さんに native の応募だと思った、と言っていただいて考えたんですが、文をぱっと見た時の見た目とか、地味に気になる方で、特に80文字制限でコメントやコミットメッセージ書いてる時には各行末の位置がだいたいそろうようにとか、 URL を入れる直前で改行が入るようにとか、英文を適当にいじって文の見た目を調整、みたいなことは普段から結構半分無意識でやってるので、まぁ割と慣れた作業ではありました。

これに加えて ruby の文法の制約が少しだけ問題になってきまして、例えば in の前に改行を入れたり、 At the end の方の end の後に単語を続けるのは syntax error になってしまいます。最後の you != program は、ここだけ ruby ぽい式で、最後まで英文だけの方がいいかな、とも思ったんですけど、うまい具合に you != program だけ最後の行にいる感じにできて、なんかこれはこれでアクセントになって私の美的感覚では良いような気がしたので、これで良いことにしました。

main trick の for による変数宣言は downcase_quine.rb の時に、 end if によって今までの文を全部無視させるちゃぶ台返しzinnia さんがはっておられたコード を見て面白いなと思ったので使った感じでした。最初は後置 rescue でちゃぶ台返す予定だったんですけど、例外飛ぶってのもなぁと思ったのでやめにしました。

あと、 perl だと似たようなことが無駄に多い予約語と bareword のおかげでだいぶやりやすいんですけど、 ruby だとまぁまぁキツかったりします。意味があることをするのはほぼ不可能だと思います。というか perl はポエムを書くための言語とも言えます。ただもう少し実際に実行される式は増やせたかなぁとは思います。でも英語として不自然になってしまうかな。

自作 pangram 供養

kinaba さんのところに書いた通り、数時間程度私も pangram を書こうと努力してたのですが、ボツになった上に kinaba さんのやつの方がはるかにうまくやってるので、ここに捨てておこうかと思います。

私は kinaba さんのやつとは違って、記号とかの重複は許して、その変わりに全ての数字と小文字アルファベットに意味を持たせて、単純に他の文字に置き変えたらプログラムが壊れる、ということを目標にしていました。

最終的に手元にあったのはこんなコード。

$ky;
($. += '+z' =~ /.$/mox
 [*'Fc'..'Gj'][6] + "#$&#$&B" + [*'q'..'v'][4] + "#$&#$&" =~ /..../
 puts $.%(7+8)<=rand ? $&+$' : $.%5==$.-$. ? $' : $.%(9/(1+2))==0 ? $& : $.
 )while/.{3}/!~"#$."

やはり記号使いまくりで見た目のわかりやすいインパクトがはるかに劣るし、出力も単なる fizzbuzz (とはいえ上のコード見て fizzbuzz とはわからんでしょうけど) で面白みに欠けます。何より当初の目標であった、「どのアルファベットを別の文字に置き換えてもプログラムが壊れる」という努力目標が達成されてないので、未完になってます。というかまだ使ってない文字があったので今適当に捨てました。 $ky とか。来年があればその努力目標を達成して提出したいかなぁ、と思っていたのですが、 kinaba さんのコードがある以上、このコードがあれ以上の価値を持つことは無いと思うので、ボツです。

あともう一つもっと時間を投下してた方は、そっちも見た目のインパクトよりテクニック重視な感じのオタくさいコードですけど、一応来年があるなら完成させたいかな、と…

まとめ

楽しかったです。割と遅くにやりはじめたのにこころよくプログラムに入れさせていただいた ruby kaigi staff の方々と、なんかめんどくさいことを全部やってくださった mame さんに感謝です。

残念な点があるとすると参加者が日本人だけだったことと、割と知った人、特に審査員が多かったことです。 IOCCC よりはまだまだかなりカジュアルで小粋な小品的なものが評価される感じだと思うので、来年はぜひ気軽に参加してくださる方が増えればなぁと思います。こういうのはネタ切れを起こしやすいので、正直長く続けられるとはあまり思ってませんが、あと一回くらいはやりたいなぁと思っています。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h