macoril's diary

へたれプログラマーのリハビリな日々

CodeIQではreadlineが使えない?→公式からバグがあると返答がありました

追記(2016/03/10 07:10)

CodeIQの運営から返答ありました。(2016/03/02 10:21) 要約すると * 企業版ideoneのjavascript(spidermonkey)のreadlineにバグがある * 企業版ideoneのバージョンアップが必要になるが、その目処はたっていない

ということなので、当面はEOFを判定する必要があるような出題にJavaScript(SpiderMonkey)で解答するのは無理そうです。


最近コーディングのリハビリを兼ねてCodeIQの問題をいろんな言語で解いてみてる。

んで今日は、JavaScript(SpiderMonkey)で書いてたんだけど、ideoneで問題なく実行できる(実行時間0.01s)コードが、CodeIQで試すと標準入力を受け取ってるところでタイムアウトするんだよね。ちなみにideoneではCodeIQと同じ入力内容で試してる。

↓のようなシンプルな作りなんだけど、どうもreadlineの部分がダメみたい。

while ((line = readline()) !== null) {
    // 各行に応じた処理
}

whileが止まらないということなんだろうから、大方nullが返っていないということなんだろう。
代わりを探してみたんだけど、 Introduction to the JavaScript shell - Mozilla | MDN でstdin関連調べてみても readline() しか載ってない…

readlineについて調べてみたところでは、もともとこの関数はEOFを判定できなかったらしい。
ただ、この問題は2006年時点でBugzillaに報告されていて*1、Status は RESOLVED FIXED になっているし、やりとりの中身を見ても、EOFをちゃんと判定してnullを返すように修正する方向で進んでいるように見える。

CodeIQの標準入出力サンプル集 を見ても、SpiderMonkey載ってないしで、CodeIQのSpiderMonkeyでEOFまで標準入力を読む方法はわからずじまい。

じゃあNode.jsで、と思って、今度はideoneで書く前にCodeIQのサンプル参照したんだけど、CodeIQの標準入出力サンプル集 にサンプルはあるもののゴチャゴチャしてていまいちわかりにくいw

結局 各種言語における標準入力からのEOFまでの入力サンプル - koturnの日記 のサンプルがシンプルで凄く参考になった。

readlineの件は原因がわかったら追記する。