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 ですぐに止まってしまいました. 以上,途轍もなくどうでもいい考察でした.