バックグラウンド
Morraのゲームはシンプルなゲームです。「オリジナル」バージョンでは、複数のプレイヤーが同時に全員のハンドの合計を推測しながら0-5の数字を手で投げます。ここで使用するバージョンは、重要な戦略の可能性を高めるために変更されました。以下で説明します。
- 2人のプレーヤーがいます。
- じゃんけんのように、プレイヤーは同時に動きます。
- 各ターン、各プレイヤーは0〜5の数字を選択し、0〜5の対戦相手の選択も推測します。つまり、1ターンごとに2つの数値が出力されます。明確にするために、両方の数値の出力は、0〜5の範囲である必要があります。
- 対戦相手の選択を正しく推測したが、対戦相手が正しく推測しなかった場合、プレイした2つの数字の合計に等しい特定のポイント数を獲得します。たとえば、プレイした数字が3と5だった場合、正しい推測は8ポイントの価値があります。
- 両方または両方のプレイヤーが正しく推測した場合、ポイントは付与されません。
- 1000ラウンド後に最もポイントを獲得した人がそのゲームに勝ちます。
トーナメント
トーナメントはラウンドロビン方式で行われ、各参加者の可能なペアを作成することによって実行されます。勝利ごとに、競技者は2勝利ポイントを獲得します。引き分けごとに1勝利ポイントが得られます。負けても勝利ポイントは獲得できません。
直観的には、トーナメントの勝者は、他の人に対して最も勝利点のある競技者でなければなりません。
入場方法
競合するボットを送信するには2つの方法があります。最初の、そして最も好ましい方法は、コントローラーによって提供されるJavaインターフェースを実装することです。2番目の方法は、独立したプログラムを作成することです。
最初にJavaメソッドについて説明しましょう。実装する必要があるインターフェイスPlayer
は次の2つのメソッドを定義しpublic String getName()
ます。ボットを識別し、6つの文字列の配列としてpublic int[] getMove(String[] args)
受け取ります。例は次のとおりです。args
mychoices myguesses myscore opponentchoices opponentguesses opponentscore
042 045 0 324 432 6
これは、私が最初のラウンドで0を選択し、対戦相手が0を投げると推測したことを意味します。対戦相手が3を投げて、4を投げると推測しました。 2、つまり2 + 4 = 6ポイントを獲得します。
メソッドは、それぞれ選択と推測である2つの整数の配列を返します。例は{4,2}
、4の選択と2の推測の場合です。
メソッドとして記述された完全なJavaボットの例を次に示します。必要に応じて、サブミットにはgetMove
メソッドで行われていることを含めるだけで済みます。
import java.util.Random;
/**
* A simple example Morra bot to get you started.
*/
public class ExampleBot implements Player
{
public String getName()
{
return "ExampleBot";
}
public int[] getMove(String [] args)
{
//easiest way I know to break down to create a move history
//(just contains their throw history)
char[] theirThrowsC = args[3].toCharArray();
int[] theirThrows = new int[theirThrowsC.length];
for(int i = 0; i < theirThrowsC.length; i++)
{
theirThrows[i] = Integer.parseInt(Character.toString(theirThrowsC[i]));
}
//get my score
int myScore = Integer.parseInt(args[2]);
Random r = new Random();
int guess = r.nextInt(6);
if(theirThrows.length > 0)
{
guess = theirThrows[theirThrows.length-1];
}
//throws a random number, guesses what they threw last
return new int[] {r.nextInt(6),guess};
}
public static int otherMethod(int example) //you can write additional static methods
{
return 0;
}
}
独立したプログラムとして
現在、追加言語のサポートに制限があります。Javaの他に、Python 3.4、Perl 5、またはRuby 2.1.5で書かれたプログラムを受け入れることができます。複数の人が望む言語がある場合、私はそれを追加するために最善を尽くします。
プログラムへの入力は、コマンドラインの引数になります。次のようになります。
perl awesomebot.plx 042 045 0 324 432 6
プログラムの出力は、選択した後に推測が続き、それぞれに空白が続く必要があります。
実行に必要な正確なコマンドを回答に含めてください。Windows 8.1を実行していることに注意してください。
追加ルール
状態とタイムアウトの保存
プログラムは、ローカルディレクトリにテキストファイルを1つ作成し、そこに情報を保存できます。この情報はトーナメントを通して保持されますが、その後削除されます。ファイルに識別可能な名前を付けます。
コードの応答には500ミリ秒の時間制限があります。制限時間内に応答しない(または無効な移動を与える)と、その特定の試合は没収されます。現在、Java送信にはパッシブタイムアウト(アクティブにアップグレードする場合があります)がありますが、非Java送信にはアクティブタイムアウトがあり、500ミリ秒後にプロセスが終了します。
その他の提出ルール
- ルールを順守し、タグ付けしない限り、複数の提出が許可されます。
- 各エントリは一意である必要があります。別のボットのロジックを別の言語で正確にコピーすることはできません。
- ボットは相互に対話できません(あらゆる種類のチームを形成するため)。
- ボット内の他のボットのロジックを使用して、たとえば競合他社を特定し、その動作を予測することはできません。もちろん、相手の戦略を決定しようとすることもできます。
- コントローラー、他の参加者、またはコンピューターを台無しにしないでください。外部の情報ソースに接続しないでください。
コントローラー
コントローラの現在のバージョンはここにあります。これはJava 8で書かれています。「トーナメント」ファイルはメインコントローラであり、競合他社のリストも含まれています(独自の競合をホストする場合)。
リーダーボード
リーダーボードを頻繁に更新することはできませんでした。今週末はかなり忙しいです。「やや忙しい」とは、午前6時30分から午後9時30分までコンピュータにアクセスできないことを意味します。5回実行した後のスコアは次のとおりです。「Echo」ボットは何らかの理由で没収を続けました(私のせいかもしれませんが、まだ調査していません)。
170 - Quinn and Valor
158 - Historian
142 - DeltaMax
140 - MorraCowbell
132 - Extrapolator
115 - Rainbolt
102 - Popularity
100 - Interpolator
83 - CounterBot
80 - Basilisk
76 - Erratica
65 - Trendy
63 - Scholar
62 - RandomGuesser
60 - KingFisher
59 - NullifierBot
55 - EvolvedBot
48 - Confused
クレジット
RainboltとPeter Taylorに、コントローラーのサポートに感謝します。