intime o'

彼は農場なるものを定義し、描写し、説明し、陳述し、叙述しようと弁舌をふるった (「O・ヘンリー短編集(三)」より)
Node.js v0.6 2012/07/04(Wed.)
 回りが「じゃんけん」について楽しそうに議論していて私も
参加したくなったのでしてしまった.
http://kupc2012.contest.atcoder.jp
よくわかんないけど、京大のグループがAtCoderってゆうオンライン
ジャッジサーバ借りて実施する大会ってゆうことらしい.
プログラミングコンテストとかほとんど初めてだから知らん.

問題のリスト
http://kupc2012.contest.atcoder.jp/assignments

じゃんけんはE.でもせっかくだからAから順にやった.
JavaScriptを使えるというから検索してみたらjsで解いた
人が一人もいなかった.もったいないので使うことにした.

使える言語はそこそこあるけどjavascriptだけどうしても遅い.
自分からわざわざハンデを負うだなんてとんだマゾだなと苦笑い.

javascriptの仕様つまりECMAScriptにはそもそも入出力の為の命令
の仕様なんてないので処理系依存になるのだが、Node.js v0.6.12が
使われているらしい.私の知ってる方法だと0.6までにはバグがあって
ファイルのリダイレクションなんかでデータを流し込むとエラーで
動かないはず.

ググったらすぐに見つかった.
これを参考にしろ、と
http://arc003.contest.atcoder.jp/submissions/22572

つまり、ファイル「/dev/stdin」から読みこめばいいのだな.
通った通った.
最初に一度だけ入力がある場合にはそれでよい.

「G. 村」
http://kupc2012.contest.atcoder.jp/submissions/31744
これは、見てみたらTLEしてる人が結構人いて、丁寧に考えてやらないと
時間がかかりすぎる.でもね、ちゃんとやればjavascriptでもギリギリ
時間内に収まる.すごい.
規定は4秒.
私の上のコードで、3918 msであった.これはいくつかのテストケースに
ついてかかった時間の最大値.遊びでショートコーディングし直したら
すぐTLEになった.
意外だったのは、やはりC++は速いけどHaskellも言うほど遅くない.
Javaはやっぱり遅いなって.

「E. じゃんけん」
前と違うタイプ.次の次くらいの「宝探し」もそうなんだけど、
途中からも入力が差し込まれるタイプ.
つまり、はじめにデータが渡されてから、
for (sometimes) {
    何か出力、それを受けてサーバが出力.それをこちらが入力として読み込む
}

こういうタイプの問題はちょくちょくありそうなのでやり方を覚えておかないと
いけない.次の解答で通った.
http://kupc2012.contest.atcoder.jp/submissions/31806

入力をストリームとして読み込む、nodejsとしてはむしろこっちである
べきやり方だ.

逆にさっきの問題もこれでできたのかな.試してみよう.
でも非同期だとどういう入力なのかを関数が分かってくれないから困る
 main = input;
var rStream = require("fs").createReadStream('/dev/stdin', {encoding: 'utf-8', bufferSize: 1000});
rStream.on('data', function(data) {
    main(data);
    main=solve;
}); 
とにかく関数はdataが入力だとしか分からないけど、mainという変数に
どういう関数が入っているかで挙動が変わる.
上のコードでは最初の一度だけ input(data) であり、次回以降 solve(data) を
実行する.

上のコードは正しくはない.
ストリームで来るデータは断片である.下のリンクの説明の方がちゃんとしてる
けど、バッファサイズとして指定したサイズを超えたらデータの途中でも
dataとしてやってくる.
rStream.on('end', function(){});
このイベントで input だか solve だかをすればいいのかと思ったけど
そうではないらしい (TLEになりまくって他の方に迷惑を掛けた)

コメントにも書いてたけど, data stream のコードは
 http://d.hatena.ne.jp/Jxck/20111204/1322966453
からのコピペです.


コメ(0) | トラ(0)