★ 『ハル研究所プログラミングコンテスト2020』へようこそ! ★ (C)HAL Laboratory, Inc. この度は『ハル研究所プログラミングコンテスト2020』へのご参加、 誠にありがとうございます。 今回の問題は、題して「ウサギのかけっこ修行」です。 皆さんのアイディアに富んだ作品をお待ちしています。 ------------------------------------------------------------------------ 問題とルール ------------------------------------------------------------------------ 昔むかし、かけっこでカメに負けてしまったウサギがいました。 悔しさを胸にウサギは修行の旅にでます。 次こそ勝つために、修行の地に散らばる秘伝の巻物を集めてください。 ● 修行の地について 修行の地は正方形で、位置は浮動小数点数(float)を用いて、x,y で表現されます。 後述するウサギと巻物は修行の地にランダムに配置されます。 修行の地は長さ 1 のマス目状に区切られていて、マス目ごとに平地、茂み、砂地、池のいずれかの地形が設定されています。 ある位置 x,y がどのマスに属するかは x,y それぞれの整数部によって判定されます。 ● ウサギについて ウサギの初期位置はランダムに選択したマス目の中心です。 ウサギは 1 ターン毎に任意の位置にジャンプ移動できます。 ただ移動可能な距離は足元の地形、巻物取得数で変化します。(後述) ● 巻物について 修行の地には巻物が1つ以上存在します。 巻物の初期位置はランダムに選択したマス目の中心です。 ウサギは巻物と同じマスに着地することで巻物をとることができます。 ウサギは巻物をとるとジャンプ力を向上させることができます。(後述) ● ウサギのジャンプ移動について ウサギにはジャンプ力があり、その初期値は 1.0 です。 巻物をとるごとにジャンプ力は 1.1 倍になります。 例) 巻物を 3 個とった場合、ジャンプ力は 1.0 * 1.1 * 1.1 * 1.1 = 1.331 になります。 修行の地のマス目に設定された地形ごとにジャンプ力に対する倍率が設定されています。 |地形|倍率| |----|----| |平地| 1.0| |茂み| 0.6| |砂地| 0.3| |池 | 0.1| ウサギが現在いるマス目の地形の倍率とジャンプ力をかけたものが、ジャンプ移動可能距離となります。 例) 巻物を 3 個もち砂地にいる場合、ジャンプ移動可能距離は 1.0 * 1.1 * 1.1 * 1.1 * 0.3 = 0.3993 になります。 移動先を指定することでウサギを移動させることができます。 移動先がジャンプ移動可能距離よりも遠い場所の場合は、 方向はそのままに距離をジャンプ移動可能距離で丸めた位置に移動します。 ● 1 ステージの流れ 1 ターン毎に移動先となる位置を決めます。 ※先述の通り、移動結果はジャンプ移動可能距離によって制限を受けます。 すべての巻物をとると、そのステージは終了です。 また、以下の場合は巻物が残っていてもステージは終了となり、ターン数は 1000 として計算されます。 - 1000 ターンが経過する - 移動の結果、修行の地の外へ出てしまう 全てのステージでかかったターンの合計が、最終的な評価となります。 ------------------------------------------------------------------------ 主要なパラメータ ------------------------------------------------------------------------ - ステージ数は 200 です。 - 1 ステージは最大 1000 ターンです。 - 1 ステージ中の巻物の最大数は 20 です。 詳しいパラメータについては Parameter.hpp を参照してください。 ------------------------------------------------------------------------ Answer.cpp の内容 ------------------------------------------------------------------------ Answer.cpp には、以下の関数が含まれます。 void Answer::initialize(const Stage& aStage) ステージの開始時に呼ばれます。必要に応じてステージの初期化処理を行ってください。 void Answer::getTargetPos(const Stage& aStage) 各ターンでの移動を行う関数です。 各ターンでの移動を行う関数です。このターンで行きたい座標を返してください。 行きたい座標が現在の座標と離れすぎている場合は、方向を維持したまま距離が「最大移動可能距離」に丸められます。 void Answer::finalize(const Stage& aStage) ステージの終了時に呼ばれます。必要に応じてステージの終了処理を行ってください。 ------------------------------------------------------------------------ 選考基準 ------------------------------------------------------------------------ ● 総ターン数と処理時間 ステージを規定回数繰り返し、ステージ毎のターンの総和を競います。 総ターン数が少ないほど上位となります。 総ターン数が同じ場合は、処理時間が短い作品から上位とします。 総ターン数も処理時間も同じ場合は、先に応募された作品から上位とします。 ● サーバの評価環境について サーバの評価環境は、配布パッケージと基本的に同一です。 ただし、乱数のシード値は配布パッケージと異なるものが使用されます。 また、乱数の算出方法が異なります。 また、手元でエラーやタイムアウトにならない作品でも、 サーバの評価環境ではエラーやタイムアウトになる可能性があります。 手元でいくつかの乱数シードを試すなど、安定した作品を目指すことをおすすめします。 詳しくは「補足」を参照してください。 ------------------------------------------------------------------------ 問題パッケージの内容(抜粋) ------------------------------------------------------------------------ ・README.txt はじめにお読みください ・src/Answer.cpp 応募作品サンプル ・HPC2020.sln Visual Studio 2017用ソリューションファイル ・HPC2020.vcxproj Visual Studio 2017用プロジェクトファイル ・Makefile GNU Make用Makefile ・viewer ビューア 上記以外に、チェックプログラムのソースファイルもあります。 ビューアについては、後述の「ビューア」をお読みください。 【ご注意】 ・問題パッケージに含まれるファイルやツールを、ハル研究所開催のプロコン参加目的 以外で使用すること、および再配布することを禁じます。 ・問題パッケージに含まれるファイルやツールを使用したことによって 生じる損害について、ハル研究所は一切の責任を負わないものとします。 ・ソースファイルの文字コードはUTF-8(BOMあり)、改行コードはLFです。 ただし、その他のファイル(Makefileやviewerフォルダ内のファイルなど) については、UTF-8(BOMなし)を使用しています。 ------------------------------------------------------------------------ チェック方法 ------------------------------------------------------------------------ 問題パッケージに含まれるチェックプログラムのソースファイルを お持ちの環境でコンパイルして実行してください。 実行すると、実装した関数が正しいかどうかチェックし、正しければ スコアを表示します。 本番の評価時は、LOCALが定義されずにコンパイルされます。 お持ちの環境でのみ実行したいコードは、LOCAL定義で括ってください。 ------------------------------------------------------------------------ ビューア ------------------------------------------------------------------------ 問題パッケージには、作品の挙動を確認できるビューアも含まれています。 ビューアはWebブラウザで動作し、チェックプログラムから出力される JSONファイルを読み込むことで動作させることができます。 チェックプログラムからJSONファイルを出力するためには、 コマンドプロンプトや端末などのコンソールから -j オプションをつけて プログラムを実行し、実行結果をファイルにリダイレクトします。 下の例は、JSONファイルを output.json に出力しています。 ./hpc2020 -j > output.json ● ビューアの見かた JSONファイルを読み込ませると、修行の地の様子が表示されます。 地面は4色で色分けされます。薄緑、濃い緑、黄色、青の順に段々「最大移動可能距離」が下がっていきます。 白色で表示されているのがウサギです。 赤色で表示されているのが巻物です。巻物にマウスオーバーすると巻物番号が表示されます。 ------------------------------------------------------------------------ 動作確認済み環境 ------------------------------------------------------------------------ ● チェックプログラム Visual Studio 2017 (HPC2020.sln, HPC2020.vcxproj を使用) GNU-CC 4.9.4 (Makefile を使用) ● ビューア Windows 10 / Edge 20.10240.16384.0 / Chrome 83.0.4103.116 Mac OS X v10.15 / Safari 13 ※上記以外のブラウザでは正しく動作しない場合があります。 ------------------------------------------------------------------------ 応募していただくもの ------------------------------------------------------------------------ 応募していただくのは、Answer.cpp またはこれに相当するソースコードです。 ログインして「作品応募」で、テキストボックスに ソースコードとコメント(任意入力、64文字まで)を入力して送信してください。 ------------------------------------------------------------------------ 作品規定 ------------------------------------------------------------------------ ・オリジナルのプログラムに限ります。 ・使用可能な言語はC++です。※C++14が使えます。 ただし、以下の機能は使用できません。 ・インラインアセンブラ ・例外(try,catch,throw等) ・標準ライブラリが使えます。 適宜、必要なファイルをインクルードして使用してください。 ・マルチスレッド、マルチプロセスは禁止とします。 ・#pragma は使用できません。 ・巨大な応募作品はエラーとなることがあります。 ・問題パッケージでは制限時間はありませんが、評価環境での 制限時間は60秒です。 ・応募前に必ずPC上で実行して、チェックが通ることを確認してください。 ・特定のステージに依存したチューニングを行うことを禁止します。 例えば、X番目のステージの時は、あらかじめ用意した配列に基づいて 行動を決定するというような処理は禁止とします。 ・応募作品のチェックはハル研究所オリジナルの評価環境で行いますが、 問題パッケージに含まれるものと同一のチェックプログラムでのチェックとなります。 ただし、評価環境では別の乱数のシード値で評価が行われますのでご注意ください。 ・応募作品は応募時に自動チェックされますが、後ほど実行委員会が 直接チェックする場合があります。たとえチェックが通っていても、 不適切と認められる場合は無効と判定されることがありますので ご了承ください。 ・std::random_deviceを使うと、実行時エラーになります。 ------------------------------------------------------------------------ 補足 ------------------------------------------------------------------------ ・Answer.cpp の各関数の引数のオブジェクトの const をキャスト等で外す 行為を禁止します。 ・上記のようなキャスト等をせずに合法的にアクセスできる メンバ関数には、自由にアクセスして構いません。 ・使用するコンパイラの挙動により、PC上と評価環境で実行結果が 変わる場合があります。 実行委員会では例えば、未初期化変数における初期値の違いや、 関数に渡す引数の評価順序の違い、浮動小数の計算に伴う 誤差によって結果が変わる現象を確認しています。 ・乱数のシードは、問題パッケージ内のファイル Game.cpp に 含まれる randomSeedX, randomSeedY, randomSeedZ, randomSeedW の4つの整数値から決定されています。これらを変更することで、 プログラムがいろいろなシードの値で動作するかを確認でき、 プログラムの安定性をチェックすることができます。 以下のように -r オプションを使って実行時にシード値を指定することもできます。 ./hpc2020 -r 0x01234567 0x89abcdef 0x01234567 0x89abcdef