回りが「じゃんけん」について楽しそうに議論していて私も 参加したくなったのでしてしまった. 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)