この広告は、90日以上更新していないブログに表示しています。
1年以上前に出題された問題なのですが、当時 kinaba さんの解答を見て、すげーと思って、今でも一番好きなRuby のコードではないかと思っています。ので思い出したように少し書いてみます。
http://www.kmonos.net/wlog/71.html#_2014070301
問題は、 (a-b)*c というような中置記法の式を、 ab-c* というような後置記法になおせというもの。 flagitious さんと kinaba さんは eval でruby に中置記法のパースを丸投げして、 method_missing に飛んできた順で出力する、という豪快な手法で当時最短だった 61B になったのでした。こんなの
undef:pdefmethod_missing s,*;$><<s endloop{eval(gets)<<$/}
あまりにも美しいコードなんですが、3ヶ月程前に、 flagitious さんが 59B を叩き出して更新しました。で kinaba さんも追いついたのですが、どうも flagitious さんとの雑談によると、 2人のコードは違う気がしています(ほとんど alnum だと言ってた気がするので、後述するgoruby の alnum 解に近いのではないかなぁと思うけどよくわからない)。 kinaba さんの方はおそらく
undefpdefmethod_missing s,*;$><<s endeval [*$<]*'puts;'
という感じなのではないかと思います。思いついてしまえばなるほどまぁ普通かもという感じです。この解が出る前にずいぶん悩んだんですが、実は 60B を一度思いついていました。これはなかなか豪快な方法で、いつか使ってやると思っていた「def文は実はnil をかえしている」という事実を使いました。
undefpeval(gets)<<$/untildefmethod_missing s,*;$><<s end
次にgoruby なんですが、goruby は Kernel#h が定義されていて、これが Hello, world! を出してくれるんですが、この問題では余計なことを…! という感しかわいてきません。でかつ method_missing を定義して解くこの問題では、 method_missing でメソッド名が短くなるgoruby の効能が消えてしまいます。だからこの問題はgoruby 向いてない…と思っていたのですが、色々やってみると 40B とかいう驚異的なことになっていたのでした。
O.u:p,:hO.a_ _,:printeval [*$<]*'say;'
何してるかさっぱりわからんですが、
_ が :method_missing になっているのを最初に偶然発見した時は、しばし理由がわかりませんでした。
あとは flagitious さんが最初に投稿した、ほぼ alnum のバージョンもなかなか良いです。
undefpundefhaliasmethod_missingprintsayuntileval gets
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。