λx. x K S K @はてな

このブログ内に記載された文章およびコードの著作権は,すべて Keisuke Nakano に帰属します.

Timeout.ml

無限ループでも重い処理でもよいので3秒間実行し続ければOKという問題. OCamlだとwhileを使うものが最短のようですが, 考えられる解をいくつか記録しておきます.

まず,最短であると思われるwhile版 (17B).

while 0=0do()done
とか
while-7<7do-7done
とかいろいろあります. 次に,再帰を使うとこんな感じ (19B).
let rec(!)_= !0;;!0
let recを使わない「再帰」では,短くするのが難しいようです (28B).
let f(`f f)=f(`f f);;f(`f f)

ついでに失敗例もいくつか挙げておきます.(疑似)無限リストを使って (19B)

let rec r=0::r;;r@r
とすると(ゴルフサーバでは)スタックオーバーフローで3秒以内で止まってしまうのでダメです. ちなみに,このコードはスタックオーバーフローで止まってしまう最短のものではなく,18B の
at_exit do_at_exit
という解もあります.終了処理関数を終了処理関数として登録するという荒技です. do_at_exitなんていうマニュアルにない関数を使ってしまってるのがアレですが.

あと,「ゴルフサーバでは test.ml というファイル名で実行される」ということを利用して 13B の

#use"test.ml"
も考えましたが,残念ながら Too many open files ですぐに止まってしまいました. 以上,途轍もなくどうでもいい考察でした.