README.txt
★ 『ハル研究所プログラミングコンテスト2019』へようこそ! ★
Copyright HAL Laboratory, Inc. All rights reserved.
この度は『ハル研究所プログラミングコンテスト2019』へのご参加、
誠にありがとうございます。
今回の問題は、題して「カメの早食い競走!」です。
皆さんのアイディアに富んだ作品をお待ちしています。
------------------------------------------------------------------------
問題とルール
------------------------------------------------------------------------
お腹をすかせたカメたちが、エサいっぱいの広場にやってきました。
道に落ちていたり、高いところにぶら下がっていたりと、エサはあちこちにあります。
効率よくエサの場所に移動し、時にはみんなで協力して、早くエサを食べましょう!
● 広場について
・広場は長方形で、x,yのグリッドで表現されます。(x,yは整数)。
・後述するカメとエサはこの広場にx,yのグリッド単位で配置されます。
● カメについて
・カメは広場に複数存在します。初期位置はランダムです。
・各カメは1ターン毎に上下左右のいずれかに1歩移動できます。
・同じ位置に複数のカメが重なることができます。
● エサについて
・エサは広場に複数存在します。初期位置はランダムです。
・エサは、ある高さのところに設置されます。設置される高さはランダムな整数です。
● エサを食べる方法
エサは色々な高さに配置されているので、カメ同士協力しないと高い位置のエサは食べられません。
同じ位置に複数のカメが集まることで、高い位置にあるエサを食べることができます。
例えば高さが3のエサを食べるには、カメが3匹そのエサの位置に集まらないといけません。
(カメがその位置で重なって、高いエサに届くようになります)
● 1ステージの流れ
1ターン毎に以下の処理を行うことができます。
・上下左右のいずれかに1歩移動する。
・何もせずに待機する。
すべてのエサを食べるとそのステージは終了です。
エサが残っていても、1000ターンが経過すれば自動的にそのステージは終了となり、次のステージに進みます。
全てのステージでかかったターンの合計が、最終的な評価となります。
------------------------------------------------------------------------
主要なパラメータ
------------------------------------------------------------------------
・ステージ数は240です。
・1ステージは最大1000ターンです。
詳しいパラメータについては Parameter.hpp を参照してください。
------------------------------------------------------------------------
Answer.cpp の内容
------------------------------------------------------------------------
Answer.cpp には、以下の関数が含まれます。
void Answer::initialize(const Stage& aStage)
ステージの開始時に呼ばれます。必要に応じてステージの初期化処理を行ってください。
void Answer::setActions(const Stage& aStage, Actions& aActions)
各ターンでの行動を行う関数です。このターンで行うカメの行動をaActions配列に設定してください。
void Answer::finalize(const Stage& aStage)
ステージの終了時に呼ばれます。必要に応じてステージの終了処理を行ってください。
------------------------------------------------------------------------
選考基準
------------------------------------------------------------------------
● 総ターン数と処理時間
ステージを規定回数繰り返し、ステージ毎のターンの総和を競います。
総ターン数が少ないほど上位となります。
総ターン数が同じ場合は、処理時間が短い作品から上位とします。
総ターン数も処理時間も同じ場合は、先に応募された作品から上位とします。
● サーバの評価環境について
サーバの評価環境は、配布パッケージと基本的に同一です。
ただし、乱数のシード値は配布パッケージと異なるものが使用されます。
また、乱数の算出方法が異なります。
また、手元でエラーやタイムアウトにならない作品でも、
サーバの評価環境ではエラーやタイムアウトになる可能性があります。
手元でいくつかの乱数シードを試すなど、安定した作品を目指すことをおすすめします。
詳しくは「補足」を参照してください。
------------------------------------------------------------------------
問題パッケージの内容(抜粋)
------------------------------------------------------------------------
・README.txt はじめにお読みください
・src/Answer.cpp 応募作品サンプル
・HPC2019.sln Visual Studio 2017用ソリューションファイル
・HPC2019.vcxproj Visual Studio 2017用プロジェクトファイル
・HPC2019.xcodeproj Xcode用プロジェクト
・Makefile GNU Make用Makefile
・viewer ビューア
上記以外に、チェックプログラムのソースファイルもあります。
ビューアについては、後述の「ビューア」をお読みください。
【ご注意】
・問題パッケージに含まれるファイルやツールを、プロコン参加目的
以外で使用すること、および再配布することを禁じます。
・問題パッケージに含まれるファイルやツールを使用したことによって
生じる損害について、ハル研究所は一切の責任を負わないものとします。
・ソースファイルの文字コードはUTF-8(BOMあり)、改行コードはLFです。
ただし、その他のファイル(Makefileやviewerフォルダ内のファイルなど)
については、UTF-8(BOMなし)を使用しています。
------------------------------------------------------------------------
チェック方法
------------------------------------------------------------------------
問題パッケージに含まれるチェックプログラムのソースファイルを
お持ちの環境でコンパイルして実行してください。
実行すると、実装した関数が正しいかどうかチェックし、正しければ
スコアを表示します。
本番の評価時は、LOCALが定義されずにコンパイルされます。
お持ちの環境でのみ実行したいコードは、LOCAL定義で括ってください。
------------------------------------------------------------------------
ビューア
------------------------------------------------------------------------
問題パッケージには、作品の挙動を確認できるビューアも含まれています。
ビューアはWebブラウザで動作し、チェックプログラムから出力される
JSONファイルを読み込むことで動作させることができます。
チェックプログラムからJSONファイルを出力するためには、
コマンドプロンプトや端末などのコンソールから -j オプションをつけて
プログラムを実行し、実行結果をファイルにリダイレクトします。
下の例は、JSONファイルを output.json に出力しています。
./hpc2019 -j > output.json
● ビューアの見かた
JSONファイルを読み込ませると、広場の様子が表示されます。
緑色で表示されているのがカメです。右下の数字はカメがその位置で何匹重なっているかを示します。
黄色で表示されているのがエサです。左上の数字は高さ(エサを食べるのに必要なカメ数)です。
------------------------------------------------------------------------
動作確認済み環境
------------------------------------------------------------------------
● チェックプログラム
Visual Studio 2017 (HPC2019.sln, HPC2019.vcxproj を使用)
Xcode 8.0 (HPC2019.xcodeproj を使用)
GNU-CC 4.9.4 (Makefile を使用)
● ビューア
Windows 10 / Edge 20.10240.16384.0 / Chrome 53.0.2785.116
Mac OS X v10.13 / Safari 11
※上記以外のブラウザでは正しく動作しない場合があります。
※IEでは動作が遅くなる場合があります。
------------------------------------------------------------------------
応募していただくもの
------------------------------------------------------------------------
応募していただくのは、Answer.cpp またはこれに相当するソースコードです。
ログインして「作品応募」で、テキストボックスに
ソースコードとコメント(任意入力、64文字まで)を入力して送信してください。
------------------------------------------------------------------------
作品規定
------------------------------------------------------------------------
・オリジナルのプログラムに限ります。
・使用可能な言語はC++です。※C++11が使えます。
ただし、以下の機能は使用できません。
・インラインアセンブラ
・例外(try,catch,throw等)
・標準ライブラリが使えます。
適宜、必要なファイルをインクルードして使用してください。
・マルチスレッド、マルチプロセスは禁止とします。
・#pragma は使用できません。
・std::random_deviceを使うと、実行時エラーになります。
・巨大な応募作品はエラーとなることがあります。
・問題パッケージでは制限時間はありませんが、評価環境での
制限時間は60秒です。
・応募前に必ずPC上で実行して、チェックが通ることを確認してください。
・特定のステージに依存したチューニングを行うことを禁止します。
例えば、X番目のステージの時は、あらかじめ用意した配列に基づいて
行動を決定するというような処理は禁止とします。
・応募作品のチェックはハル研究所オリジナルの評価環境で行いますが、
問題パッケージに含まれるものと同一のチェックプログラムでのチェックとなります。
ただし、評価環境では別の乱数のシード値で評価が行われますのでご注意ください。
・応募作品は応募時に自動チェックされますが、後ほど実行委員会が
直接チェックする場合があります。たとえチェックが通っていても、
不適切と認められる場合は無効と判定されることがありますので
ご了承ください。
------------------------------------------------------------------------
補足
------------------------------------------------------------------------
・Answer.cpp の各関数の引数のオブジェクトの const をキャスト等で外す
行為を禁止します。
・上記のようなキャスト等をせずに合法的にアクセスできる
メンバ関数には、自由にアクセスして構いません。
・使用するコンパイラの挙動により、PC上と評価環境で実行結果が
変わる場合があります。
実行委員会では例えば、未初期化変数における初期値の違いや、
関数に渡す引数の評価順序の違い、浮動小数の計算に伴う
誤差によって結果が変わる現象を確認しています。
・乱数のシードは、問題パッケージ内のファイル Game.cpp に
含まれる randomSeedX, randomSeedY, randomSeedZ, randomSeedW
の4つの整数値から決定されています。これらを変更することで、
プログラムがいろいろなシードの値で動作するかを確認でき、
プログラムの安定性をチェックすることができます。
以下のように -r オプションを使って実行時にシード値を指定することもできます。
./hpc2019 -r 0x01234567 0x89abcdef 0x01234567 0x89abcdef