README.txt

   ★ 『ハル研究所プログラミングコンテスト2018』へようこそ! ★

         Copyright HAL Laboratory, Inc. All rights reserved.


 この度は『ハル研究所プログラミングコンテスト2018』へのご参加、
 誠にありがとうございます。
 今回の問題は、題して「がんばれ!街のお菓子屋さん」です。
 皆さんのアイディアに富んだ作品をお待ちしています。

------------------------------------------------------------------------
 問題とルール
------------------------------------------------------------------------

 ここは街の小さなお菓子屋さん。大人気の「気まぐれシカクッキー」を、今日もオーブンフル稼働で焼いています。
 オーブンをうまく活用して、様々な大きさのクッキーを手際よく、たくさん焼いてください。

 ● オーブンについて

  ・オーブンは正方形で表現されていて、20×20のグリッドで表現されます。
  ・後述するクッキー生地をこのグリッド単位で配置します。

 ● クッキーについて

  オーブンにクッキー生地を配置して焼いていきます。
  焼きあがったクッキーは自動的にオーブンから取り出されます。この時スコアが加算されます。

  ・クッキー生地は矩形で表現されます。色々な縦横サイズ(整数)のクッキー生地が存在します。
  ・正方形のオーブンに収まる範囲内にクッキー生地を配置することができます。
  ・既に配置されているクッキー生地と重なる位置にクッキー生地を配置することはできません。
  ・焼きあがるまでの時間は「ターン」と呼ばれる単位で管理します。クッキー生地によって焼きあがるターン数は異なります。
  ・クッキーが焼きあがった時に加算されるスコアもクッキーによって異なります。

 ● 生地置き場について

  生地置き場とは、まだ焼かれていないクッキー生地の置き場所です。焼きたいクッキー生地はここから取り出します。
  ・生地置き場には常に8個のクッキー生地が入っています。
  ・ここからクッキー生地を取り出すと、新たにクッキー生地が補充されます。
  ・小さいクッキー生地の入った「生地置き場A」と、大きいクッキー生地の入った「生地置き場B」が存在します。

 ● 1ステージの流れ

  1ステージにつき、1000ターンの処理を行えます。
  ステージ開始時、オーブン内にクッキー生地は存在しません。

  1ターン毎に以下の処理を行うことができます。

  ・生地置き場からクッキー生地を取り出し、オーブンに配置する
   生地置き場Aまたは生地置き場Bから1つクッキー生地を取り出し、オーブンに配置できます。
   各生地置き場内の任意のクッキー生地を取り出すことができます。
   オーブン内の配置可能な任意の位置に、クッキー生地を配置できます。
   オーブンにクッキー生地を配置できるのは、1ターンに1回だけです。

  ・何もせずに待機
   オーブンがクッキー生地で埋まっていて、新たにクッキー生地を配置できない場合は、待機を選択してください。

  1000ターンが経過すれば、そのステージは終了となり、次のステージに進みます。
  全てのステージで獲得したスコアの合計が、最終的な評価となります。

------------------------------------------------------------------------
 主要なパラメータ
------------------------------------------------------------------------

 ・ステージ数は20です。
 ・1ステージは1000ターンです。
 ・オーブンの大きさは縦横20×20です。
 ・生地置き場に入っているクッキー生地数は8です。
 ・生地置き場は、小さいクッキー生地の入った「生地置き場A」と、大きいクッキー生地の入った「生地置き場B」があります。


 詳しいパラメータについては Parameter.hpp を参照してください。

------------------------------------------------------------------------
 Answer.cpp の内容
------------------------------------------------------------------------

 Answer.cpp には、以下の関数が含まれます。

 void Answer::init(const Stage& aStage)
 ステージの初期化関数です。必要に応じて初期化を行ってください。

 Action decideNextAction(const Stage& aStage)
 各ターンでの行動を行う関数です。このターンで行う行動をActionとして返してください。

 void Answer::finalize(const Stage& aStage)
 ステージの終了時に呼ばれます。必要に応じて、ステージの終了処理を行ってください。

------------------------------------------------------------------------
 選考基準
------------------------------------------------------------------------

 ● スコアと処理時間

  ステージを規定回数繰り返し、ステージ毎のスコアの総和を競います。
  スコアが多いほど上位となります。
  スコアが同じ場合は、処理時間が短い作品から上位とします。
  スコアも処理時間も同じ場合は、先に応募された作品から上位とします。

 ● サーバの評価環境について

  サーバの評価環境は、配布パッケージと基本的に同一です。
  ただし、乱数のシード値は配布パッケージと異なるものが使用されます。
  また、乱数の算出方法が異なります。

  また、手元でエラーやタイムアウトにならない作品でも、
  サーバの評価環境ではエラーやタイムアウトになる可能性があります。
  手元でいくつかの乱数シードを試すなど、安定した作品を目指すことをおすすめします。
  詳しくは「補足」を参照してください。

------------------------------------------------------------------------
 問題パッケージの内容(抜粋)
------------------------------------------------------------------------

 ・README.txt         はじめにお読みください
 ・src/Answer.cpp     応募作品サンプル
 ・HPC2018.sln        Visual Studio 2017用ソリューションファイル
 ・HPC2018.vcxproj    Visual Studio 2017用プロジェクトファイル
 ・HPC2018.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 に出力しています。
  ./hpc2018 -j > output.json

 またビューアでは、以下のライブラリを利用しています。
  vue.js

------------------------------------------------------------------------
 動作確認済み環境
------------------------------------------------------------------------

 ● チェックプログラム

  Visual Studio 2017 (HPC2018.sln, HPC2018.vcxproj を使用)
  Xcode 8.0          (HPC2018.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 オプションを使って実行時にシード値を指定することもできます。
  ./hpc2018 -r 0x01234567 0x89abcdef 0x01234567 0x89abcdef