整数リストの変換ゴルフ

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の形を一度捨てればよかった。
さすがに普段ゴルフしてない人に負けるのはどうよ、なのでせめて並びたかったです。

jQuery の罠

jQuery では jQuery オブジェクトを通じで DOM を弄ることになるのですが、例えば…

$("#id").value;
$("#id").value = "set";

とかすると、ダラーの子が返すのはそのままの DOM オブジェクトではなく jQuery オブジェクトなので「value なんてないよ」と叱られてしまいます。
value を弄るために jQuery オブジェクトには「val」というメソッドがあるのですが、こいつは変数じゃなくてメソッドなので、同じようには使えません。

$("#id").val();
$("#id").val("set");

で、そうすべき場所で変数みたいに使ってるのに気がつかずに30分程ハマりました。ほげー。