トップ «前の日記(2007-02-23) 最新 次の日記(2007-03-02)» 編集

U-memo

2006|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|
2009|08|10|
2010|02|03|
2011|11|12|
2012|04|
2016|02|
All= / Today= / Yesterday=

2007-02-26 [長年日記]

_ [Golf][OCaml] 演算子法(ネタばれ)

いやーこれはすごい技だ。suiginto さんすごい。 prime numbers はとうとう二桁台に突入してしまいましたよ。

# ハミング数は追い付いたけれど中身が全然違いそうですね。

この技、 応用できるケースは少ないですが、単にスペース分が減るだけじゃない事も出来たりします。

let f a b=hoge;;f p q;f r s
let(@)a b=hoge;;p@q;r@s
let(@)a b=hoge;r;;p@q@s

演算子関数に値をうまく返してやると、 最後のように演算の連続にすることで短くなるようなケースがあるよ (例では同じ長さだが)。

_ [Golf][OCaml] あなごる ちょーネタばれ

最後の?隠しネタをネタばらし。

今までずいぶんと使ったけれど、最新の記録ではあまり使わなくなった、 というのもあって。

ヒントは書いたことがあるけれど。

固定回数のループを再帰で書く場合、

let rec f i=i>0&f(...;i-1);;f(read_int())

などと、ループの非終了条件になる i>0 を書くと思うが、 「ゴルフ場は標準エラー出力に何を出してもいい」のだから、

let rec f i=f(...;i-i/i);;f(read_int())

と書ける。Division by Zero 例外で再帰を抜けるわけだ。 もっとも簡単なのは上の通り、定数の 1 を i/i で置き換える。

prime numbers はこれを使っても使わなくても 97B になってしまったのだが、それまではこれを利用していた。

類似のネタとして、配列や文字列の Out of bounds も使える。