2014年10月7日火曜日

Greedというプラグイン


土曜日に「今日は思う存分、過去問を楽しもう!」と思ってTopCoderのアリーナ起動したら、過去問の数がいつもと違ってものすごく少ない。なんで??と思ってあれこれみていると、Active Contestsの欄に大会のお知らせのようなものが。

というわけで、TopCoderのSRM大会に初参戦!!

私は、練習問題を解く時には、Arenaで起動されるエディタを使って直接ソースを書いていたのだけれど、他の人のソースを見るとエディタのプラグインのコメントのようなものがあったので、そういうのがあるんだろうなとは思っていた。


Arena用のプラグインGreed


そこで、せっかく大会に出るんだから、環境も適当に整えよう!と思ってネットで検索。
どうやら、Greedというプラグインが評判良いらしい。
https://github.com/shivawu/topcoder-greed

そして、「これいいよー」と紹介している人のページ(日本語)
http://qiita.com/ororog/items/42a9032f20bd9d239f95


上でも書いた通り、SRMの問題に対する回答は、Arenaアプレットのフォームにプログラムを直接書き込むことで提出する。

しかし、このGreedプラグインを使うことで、問題に対する解答のためのソースファイルの雛形がローカル(自分のパソコン)に作成されるので、そのファイルを自分がいつも使っているエディタで編集することが出来るようになる。しかも、このローカルのソースファイルはGreedによってArenaと連動されているので、ファイルがローカルにあるということを意識せず、Arenaアプレット側のコンパイルやテスト、サブミットボタンを押すだけで、通常のアプレット上でのテストやサブミットが行われる。

また、ここで作成してくれるソースの雛形は、問題で指定されている提出用のクラスとメソッドを定義してくれるので、あとは中身を書くだけの状態になっている。そして、このソースはそのまま、ローカルでコンパイルして実行すると、問題に付随してくるテストケースをを試して、その結果を表示てくれるプログラムもつけてくれている。(提出時には、これらテストケースを実行するメイン部分は自動的に省いてくれるので、何も気にすることはない。)

更に更に、問題文をHTML形式にしたファイルもローカルのディレクトリに作成してくれる。Arenaのアプレットで読むよりも、いつも使っているブラウザで見る方が字も読みやすいし、翻訳とかもブラウザからのほうがしやすい。

すなわち、このプラグインは「とっても便利!Greed最高!」なのだ。


SRM初参戦日記


さて、そんな感じに、環境は万全に整ったのは良いが、肝心のプログラミング技術の方が素人。

その日までの間に、Div2 Easyの問題にいくつか挑戦していたが、C++のコンパイルってどうやるんだっけ?から始まって、vectorやstringのメソッドをネットで適当に検索しながらプログラムを書くというレベル、、、大体、問題の英語を読んで、問題を理解するのも時間かかるので、今回の大会は、まずは1問を時間内に解けることを目標にしようと思って、エントリー開始時間を待っていた。


エントリー開始は、午後10時。
同意書みたいなのに同意して、エントリー。

参加者の一覧みたいなのが見れるので、覗いてみると、あこがれのレッドコーダーは日本人にもいっぱいいた。というか、日本人の参加者が結構多いんだなぁという印象を受けた。白色のNON-RATEDの人は多分大会初挑戦なんだろうけれど、その時点では日本人の白色は3人程度で、なんとなく、怖気づく。。

大会開始5分前、午前12時55分頃。
チャット画面では、エントリー締め切りがアナウンスされ、なんとなくチャット画面ごしに参加者達がざわざわしている雰囲気が伝わってくる。

そして、各部屋に移動。Div2のとある部屋に振り分けられた。
午前1時開始なのだが、Arenaで、問題の選択が出来るようになっている。
「このメニューもう触っていいの??時間まで、触らない方がいいのなか?」とかと動揺しつつ、大人しくじっと待つ。

午前1時!!!
問題を開いてみる。Div2Easy、250点問題だ!

一見して、問題文がやたら短い!!
短い英文は、英語が不得意だと逆に分かり辛く、正確な意味がわからなかった。
が、しかし、Test casesをみる事でなんなく把握できた。

コーディングしてコンパイルすると、一発でコンパイル完了。
実行してみると、全部のテストケースをパス!!すぐさま、サブミット。

開始からたぶん15分くらいしか経っていなかった。
「何か奇跡がおこっている!!」
そう思って、今まで練習でも一回しか挑戦したことのない500点問題、div2Mediumを開いた。

問題文の英語はなんとなく理解できた。
さっそくプログラムを書き始めたが、使われている変数の型が「long long」とかなっているのが気になる。

私のプログラム技術はforもしくはwhileで単純に調べて回る全探索しか使えないので、あまり扱う数が大きくなると、単純にプログラムの時間が掛かりすぎて、制限時間オーバーになる可能性が高いという認識があった。

だから、long longみたいに「大きな数」を扱うのはヤバそうだったが、どうしょうもない。

とりあえず、プログラムが書けたのでローカルでコンパイル、そして実行。
案の定、実行時間が2秒を超えるテストケースがあった。つまり、時間オーバーだ。

しかし、どこかのページで「TopCoderのサーバーは、自分達が使っているパソコンより性能が高く早い、、」というのを見たのを思い出し、とりあえず、サーバー側でコンパイルしてテスト。

すると1.6秒くらいで実行できており、制限にかからないようだった。
そこで、「改善する方法探すより、次に行こう!!」ってことで、そのままサブミット。

なんと、未知の1000点問題Div2Hardに辿り着いてしまった。
多分、残り時間30分くらい。

勇敢に開いてはみたものの、問題文が何を言ってるかさっぱりわからない。
何度も読み返しているうちに、いわゆる「木構造」とかいうものの話なのかな?とか、edgeって点を繋ぐ線のことかな?とか、それくらいまで想像しつつ、、疲れて飽きてきた。

多分、これは問題が読み解けたところで、コーディングは全く無理と判断して、のんびり、問題文の意味を考え続けていたら制限時間が近づいてきた。
そこで、とりあえず、Greedが生成した空のソースをサブミットしておいた。

で、制限時間到来!!
5分の休憩時間。

この時、(その部屋の?)順位みたいなのが発表されていた。
ちらっと見たら、私のハンドル名がリストの上から2番目にあったような気がしていた。

暫くして、TopCoderに特有のチャレンジフェーズという、他人のソースを見てバグを発見し、ポイントをゲットする競争が始まった。そして、チャレンジフェーズが始まってみると、一覧のさっきの場所に、私の名前がなくなっていて「ん???」と思った。

私のHardの問題がチャレンジされて撃墜されていたのだ。
つまりは、Hardまでサブミットしていたので、その時点で点数が入っていて、上位に名前があったらしい。

しかし、あっという間の撃墜だった。まぁ、慣れてる人が見て、「こいつ、なめすぎ!!糞ニュービー」っていって、落とされたに違いないwww

チャレンジフェーズは、私も他人のソースをあれこれと眺めみるが、いまいち把握できない。この辺はきっと訓練が必要だ。

で、チャレンジフェーズが終わったら、システムテストが始まって、システム自体がサブミットしたソースを検証してくれる。これにパスすればポイントが確定してレーティングが計算されるみたい。

参加者の結果一覧をみていると、次々とシステムテストに通ったとか通らないとかの表示が出てくる。私の分もチェックされたらしく、何かのウインドがポップアップしていた。あまりよく読んでいなかったけれど、部屋を入りなおすとレイティングが更新されてるよみたいなことが書いてあったんだと思う。
チャット参加者の一覧から人がどんどん抜けていくので、私も追随。

入りなおしてみると、、、、
私のハンドルネームがブルーに!!!!

なんと、「ザクとは違うのだよ、ザクとは」だったのだ。


0 件のコメント:

コメントを投稿