整数リストの変換ゴルフ
http://d.hatena.ne.jp/higepon/20080925/1222326246
ちょっと遅れましたけど。皆ややこしすぎだと思います。
o = [1,3,4,5,6,12,13,15] r=[];(o+[nil]).inject{|a,b|s,t=a;b==1+(t||s)?[s,b]:(r<<a;b)}
番兵がダサくて嫌なのですが、こんな感じで。真面目にゴルフするなら r は $* で、 nil は p とかで代用すべきですね。
もうちょっと綺麗にならないのかなあという感じなのですが、まあ適当…
追記:id:KeisukeNakano さんのほうが余裕で短いです。よく考えなくても inject とか余裕でいらんかった。
grass 私感
複雑すぎなくていい具合に楽しい言語だと思います。 esoteric な言語の中では今のところ一番好きかも。まあ使いこなせる esoteric language なんてないのでよく知りません。
しかし入出力まわりが比較的楽なのは素晴らしいと思った。いや出力は全然楽でも何でもないんですが。
話はそれますが基本的に「詳しい人しか知らない細かいテクニック」とかが、仕様単純な言語ではあまりないので、ゴルフ入門者はまず esoteric language から手を出してみるといいかもしれませんよ! $_.size が ~/$/ でいいとか誰も知りたくないでしょうし。
二年前の今頃に shinh さんに「紙にプログラム書くのが許されるのは小学生まで」と言われたのですが、今回のも実は紙に書いて考えました。この二年間まるで成長してないことがよくわかりました!
v grass
終わりました。53Bの解説…は面倒くさいので、擬似コードと分かる人にしか分からない解説を。
f(g, c){ cp = c + 1 b = 'w' == cp c_or_cp = b(c, cp) c_or_g = b(c, g) # ここで上で使った残骸を再利用 c_or_g(c_or_g, c_or_cp) # 真なら1引数を取りc(つまりv)を返し、偽なら再帰呼び出し } r = f(f, 'w') v = r(r) out(v)
ポイントは、分岐の書き方。
真偽値は二引数をとり、真なら第一、偽なら第二引数を返す関数で表されるのですが、分岐を二つ作る際に、真の方は同じものを使うことで、関数適用の回数を一回抑えています。
で、このパターンはどう考えても自分も何度も書いてたのに、なんで負けたんだーと思ってたんですが、確かまだこのパターン書いてたときは、関数適用順によって長さ変わるのに気づいてなくって、多分しっかり縮め損ねてたんだと思います…もったいない。
ちなみに自分の55Bのも擬似コード書いときます。
f(g, c){ g` = g(g) cp = c + 1 b = 'w' == cp r = b(c) # 真なら1引数をとりcを返す関数 偽なら引数をそのまま返す関数だが使われない b(r, g)(cp) # 真ならさっきの関数に cp 適用、偽なら再帰呼び出し } v = f(f, 'w') out(v)
こっちのほうがかっこいいかなーとか言ってみる。
53B版より関数適用の回数が少ないので、これ思いついた時はもう縮まないかなーと思ったんですよねえ。甘かったです。抜かれた後も55Bのを元に縮めようと頑張ってしまっていたので、まあ無理でしたね。負けました…
追記:上のは irie さんのです。 youz さんのがまた別の形だったのでものすごく簡単に解説。
関数の最後で v を出力するようにしています。まあなんというか、普通に考えるとそのままだと当然ガンガン v 以外も出力されるのですが、分岐を使って「vか関数」を出力関数に渡してやることで、エラーで無理やり止めてます。
エラーで止めるパターンも考えてたのですが、こっちはあんまり真面目に考えてなかったのでまずったなーという感じ。これの方が余裕で関数適用少なくなりますね。負けました…
うわー悔しいなあ。どっちももうちょっとちゃんと考えてれば、片方にはたどり着けた気がする。55Bの形を一度捨てればよかった。
さすがに普段ゴルフしてない人に負けるのはどうよ、なのでせめて並びたかったです。
ひらめいた!
「LL Future」と「ふるふるフューチャー」は似てる!
すみません。
jQuery の罠
jQuery では jQuery オブジェクトを通じで DOM を弄ることになるのですが、例えば…
$("#id").value; $("#id").value = "set";
とかすると、ダラーの子が返すのはそのままの DOM オブジェクトではなく jQuery オブジェクトなので「value なんてないよ」と叱られてしまいます。
value を弄るために jQuery オブジェクトには「val」というメソッドがあるのですが、こいつは変数じゃなくてメソッドなので、同じようには使えません。
$("#id").val(); $("#id").val("set");
で、そうすべき場所で変数みたいに使ってるのに気がつかずに30分程ハマりました。ほげー。