tsukammoの収穫記

上下左右の更地にアルゴリズムを

codingame:Fall Challenge 2020 ルール要約&内部パターン紹介

これはなに?

お題のゲームを解くプログラムを各自が作成、サイト上に提出して順位を競い合うゲームAIコンテストCodinGame「Fall Challenge 2020」について、ルール要約と予め設定されている内部パターンについて紹介します。 ※記載内容の保証はし兼ねるので、自己責任で読んでください。
コンテストページ:https://www.codingame.com/contests/fall-challenge-2020
コンテスト期間:11月13日~11月24日 f:id:tsukammo:20201113023607p:plain

(本ゲームは、素材を集めて注文された商品を作成していく「お店経営シミュレーション」がモチーフです。)
(類似のボードゲームがあるそうです。https://bodoge.hoobby.net/market/items/239)
ゲーム終了時に相手よりも多くのルピーを稼いでいれば勝ちです。

ルール説明

各プレイヤーは魔女を操作し、自分の手持ちのポーション素材と学習した呪文を駆使してルピーを稼いで下さい。各呪文は、素材の入手に活用することができます。 注文は常に5つ表示され、素材を消費して注文通りのポーションを作ることで、指定のルピーを稼ぐことができます。 各プレイヤーは、ターン毎に同時に1つのアクションを実行します。

素材

ポーション素材は全部で4種類あり、基本的に上位の素材を作成するために下位の素材を消費します。 より高価なポーションの作成には、よりレベルの高い素材が要求されます。 各魔女は最大10個まで素材をためておくことができます。

アクション

毎ターン、以下のいずれかのアクションを行うことができます。

  • LEARN:魔法の書庫から新しい呪文を学ぶ。
  • CAST:学習した呪文を1つ使う。※一度仕様した呪文は休息を取るまで使用不可となります。
  • REST:休息をとって、以前に唱えた呪文をすべてリフレッシュする。
  • BREWポーションを生成してルピーを稼ぐ。
  • WAIT:何もせず、ターンをスキップする。

あるターンにそれぞれの魔女が同じアクションをしたとき、双方のアクションが実行されます。

CAST:呪文を唱える

各呪文には4つの数字があり、使用時の各素材毎の増減を表します。

  • 正の数字は使用時に増える素材の量です。
  • 負の数字は使用時に消費される素材の量です。

例えば、-1,1,0,0と書かれた呪文は、レベル0の素材を消費して、レベル1の素材を産み出すことを意味します。

ゲーム中に何度でも呪文を使用できますが、一度唱えた呪文は休息を取るまで使用することができなくなります。 呪文の中には一度に連続使用可能なものがあります。

なお、ゲーム開始時には常に同じ4つの基本呪文が使用可能です。

LEARN:呪文の学習

魔法の書庫は常に6つの呪文が用意されています。どちらかの魔女が呪文を覚えた場合、その呪文は書庫から消失し、もう片方の魔女は覚えることができなくなります。

各魔女が呪文を覚える際、書庫の利用には制限がかかります。

  • どちらかの魔女が書庫を利用するまで、全ての呪文は自由に学ぶことができる。
  • 書庫の最初の呪文(下から1番目)は自由に学習できる。それ以上の呪文を覚えるには、「先読み税」を支払う必要がある。

例えば、下から4番目の呪文を覚える場合、手待ちレベル0素材から1番目、2番目、3番目の呪文に1つずつ素材を支払います。税が支払えない場合、学習に失敗します。 税が支払われた呪文を覚えるたびに、その呪文の素材も獲得し、次のターンに使えるようになります。もし、魔女の素材が溢れる場合、余った分は捨てられます。

呪文は規定の種類がありますが、書庫に現れる順番はランダムです。

REST:休息

休息することで一度使用した呪文をリキャストできるようになります。

BREWポーション作成

注文されたポーションに必要な素材を消費して、ルピーを獲得します。 消費量はマイナスの数字で表され、正の値になることはありません。 例えば、Delta = -2, -1, 0, 0の注文は、ポーションを作るために2つのレベル0の素材と1つのレベル1の素材を消費しなければならないことを意味します。

どの注文のポーションでも作成できますが、緊急度の高い左側の注文は、緊急ボーナスを得ることができます。ボーナスの仕組みは以下の通りです。

  • 1番左の注文のポーションを作成すると+3ルピーのボーナスが与えられます。これはゲーム中に4回しか発生しません。
  • 左から2番目の注文おnポーションを作ると+1 ルピーのボーナスが与えられます。これもゲーム中に4回しか発生しません。
  • ただし、1番左に与えられる+3ボーナスを全て使い切った場合、+1のボーナスは2番目の注文ではなく1番目の注文に与えられます。

なお、同時にポーションを作成した場合、ボーナスは2回発生したとみなされます。最後の1回の場合、どちらもボーナスを取得します。

注文は規定の種類がありますが、現れる順番はランダムです。

勝利条件

少なくとも1人の魔女が6つのポーションを作成するか、100ターン経過でゲーム終了です。 ゲーム終了時、各魔女は手持ちのレベル1以上の素材1つにつき、1ルピーを得ます。 最も多くのルピーを持っているプレイヤーが勝者となります。

リーグ毎の特徴やルール開放

  • bronze:呪文の学習ができます。以降、6つの注文に応えた時点でゲームが終了します。
  • wood1:呪文が使用できます。3つの注文に応えた時点でゲームが終了します。
  • wood2:予め素材が与えられた状態で始まり呪文は使えません。2つの注文に応えた時点でゲームが終了します。

呪文と注文のパターン一覧

シミュレータにて予め定められた呪文と注文を紹介します。
※11/14にレベル1と2の値が訂正されました。
※11/17に19番目の呪文(id18)が更新されました。

呪文

左から各レベルの素材の増減です。素材消費のある呪文は全て連続使用可能です。

-3 0 0 1
3 -1 0 0
1 1 0 0
0 0 1 0
3 0 0 0
2 3 -2 0
2 1 -2 1
3 0 1 -1
3 -2 1 0
2 -3 2 0
2 2 0 -1
-4 0 2 0
2 1 0 0
4 0 0 0
0 0 0 1
0 2 0 0
1 0 1 0
-2 0 1 0
-1 -1 0 1
0 2 -1 0
2 -2 0 1
-3 1 1 0
0 2 -2 1
1 -3 1 1
0 3 0 -1
0 -3 0 2
1 1 1 -1
1 2 -1 0
4 1 -1 0
-5 0 0 2
-4 0 1 1
0 3 2 -2
1 1 3 -2
-5 0 3 0
-2 0 -1 2
0 0 -3 3
0 -3 3 0
-3 3 0 0
-2 2 0 0
0 0 -2 2
0 -2 2 0
0 0 2 -1

注文

左から各レベルの素材の消費量と、達成時の獲得ルピーです。

2 2 0 0: 6
3 2 0 0: 7
0 4 0 0: 8
2 0 2 0: 8
2 3 0 0: 8
3 0 2 0: 9
0 2 2 0: 10
0 5 0 0: 10
2 0 0 2: 10
2 0 3 0: 11
3 0 0 2: 11
0 0 4 0: 12
0 2 0 2: 12
0 3 2 0: 12
0 2 3 0: 13
0 0 2 2: 14
0 3 0 2: 14
2 0 0 3: 14
0 0 5 0: 15
0 0 0 4: 16
0 2 0 3: 16
0 0 3 2: 17
0 0 2 3: 18
0 0 0 5: 20
2 1 0 1: 9
0 2 1 1: 12
1 0 2 1: 12
2 2 2 0: 13
2 2 0 2: 15
2 0 2 2: 17
0 2 2 2: 19
1 1 1 1: 12
3 1 1 1: 14
1 3 1 1: 16
1 1 3 1: 18
1 1 1 3: 20

codingame:Spring Challenge 2020 ルール要約&マップ生成ロジック説明

これはなに?

お題のゲームを解くプログラムを各自が作成、サイト上に提出して順位を競い合うゲームAIコンテストCodinGame「Spring Challenge 2020」について、ルール要約とマップ生成ロジックを説明します。 ※記載内容の保証はし兼ねるので、自己責任で読んでください。
コンテストページ:https://www.codingame.com/contests/spring-challenge-2020/
コンテスト期間:5月8日~5月18日

f:id:tsukammo:20200508062252p:plain

(本ゲームは、コンピュータゲーム「パックマン」がモチーフです。)
相手よりも多くのペレットを食べ、マップ上の過半数のポイントを取るか、200ターン経過した場合にポイントの多ければ勝ちです。
パックマンの残数は影響しません。

ルール説明

ゲーム開始時に与えらる壁と床で構成されるグリッド上で、各プレイヤーはグリッドに沿って移動できるパックマンを操作します。 マップはランダムに生成され、幅と高さも変化します。マップの各セルは次のいずれかです。

  • 壁 ("#"で表される)
  • 床 (" "(スペース文字)で表される )

マップは常に中心の縦軸を挟んで対称的に配置されます。 多くのマップでは左右端を壁で区切っていない箇所(トンネル)があり、パックマンがトンネルを通るとマップ反対側に移動できます。

ゲーム開始時、マップはペレット or スーパーペレットで埋め尽くされます。 同じセルにパックマンが移動するとすると取得することができ、ペレットは1ポイント。スーパーペレットは10ポイントのスコアを得て、ペレットは取り除かれます。

f:id:tsukammo:20200508062537p:plain
ペレットとスーパーペレット

各プレイヤーは最大5つのパックマンを同数コントロールします。各ターン毎に、あなたのパックマンとスーパーペレットの位置に加え、視界内にあるパックマンとペレットに関する情報が与えられます。 視界は、あなたのパックマンを起点とし、上下左右の直線上に壁に遮られるまで続きます。
※初期のwood2リーグでは、最大1つのパックマンを操作し、全ての視界を持っています。

f:id:tsukammo:20200508062639p:plain
視界と壁

パックマンはじゃんけんと同様の3つのタイプを持ちます。 各タイプは移動とパックマン同士の対決に影響します。

f:id:tsukammo:20200508062706p:plain
タイプ(ROCK・PAPER・SCISSORS)

パックマンは2つのスキル(SWITCHとSPEED)を使用でき、共通のクールダウンは10ターンです。スキルはゲーム開始時から使用可能です。

アクション

あなたのパックマンに対し、ターン毎に以下の操作のいずれか1つの操作をすることができます。

MOVE

パックマンに目標の位置を与えると、その位置までの最短ルートを見つけて最初のステップを移動します。 パックマンはルートを選ぶときにペレットや他のパックマンの存在を考慮せず、後述する衝突処理が発生することがあります。

SWITCH

パックマンのタイプを指定したタイプに変更することができます。

SPEED

次の5ターンの間スピードが上がり、MOVE時に2step移動します。つまり2倍の距離を移動できることを意味します。

衝突

他のパックマンと移動が交差したり同じセルに移動した場合、「衝突」が起こります。衝突発生時の解決順序は下記の通りです。

  1. 移動しているすべてのパックマンはSPEEDに関係なく 1 ステップ移動します。
  2. 同じタイプのパックマンや同じプレイヤーのパックマンがいる場合、各パックマンの移動はキャンセルされ元のセルに戻ります。 異なるプレイヤーかつ異なるタイプのパックマンの場合、同じセルに移動可能ですが、じゃんけん関係において自身より強いパックマンを横切る場合、同様に移動がキャンセルされます。
  3. 2.によって新たな衝突が発生する可能性があります。このため、新しい衝突が発生しなくなるまで前のステップが繰り返されます。
  4. 同じセルにいるパックマンのうち、じゃんけん関係において弱いパックマンはゲームから除外されます。
    ※ROCKはSCISSORSを、SCISSORSはPAPERを、PAPERはROCKに対して強いです。
  5. SPEED能力が発動しているパックマンは、もういちど1.から処理されます。

リーグ毎の開放

  • silver:自他共に(視界外でも)倒されたパックマンが入力で与えられる
  • bronze:スキル(SWITCH・SPEED)、視界の制約
  • wood1:一度に複数のパックマンを操作

※simulator上、4人同時対戦も想定されています。

マップ生成と初期位置

マップ

幅:28~3329~35、高:10~1517の範囲(ルール変更が入った模様)で一様ランダムで決定します。 2人対戦の場合は、横方向に折りたたむ線対称となり、4人対戦の場合は縦横4つ折りの線対称となります。 マップ左上から順に、下記の決められた通路の形状からランダムに選択し、当てはめていきます。 最後に、生成したマップの外周を壁で多います。その際、マップ端の床の上下が壁の場合、トンネルとして床を残します。

f:id:tsukammo:20200508063000p:plain
通路形状(■が床)※上限左右反転したものも対象

初期配置

各プレイヤーの操作するパックマンの数を2~5の範囲で一様ランダムに決定します。 生成したマップの床をランダムに選択し、線対称にパックマンを配置します。 さらに床をランダムに選択し、線対称にスーパーペレットを合計4つ配置します。

codingame:Ocean of Code ルール要約&マップ生成ロジック説明

これはなに?

お題のゲームを解くプログラムを各自が作成、サイト上に提出して順位を競い合うゲームAIコンテストCodinGame「Ocean of Code 」について、ルール要約とマップ生成ロジックを説明します。 ※記載内容の保証はし兼ねるので、自己責任で読んでください。
コンテストページ:https://www.codingame.com/contests/ocean-of-code
コンテスト期間:3月20日~4月20日

f:id:tsukammo:20200329073257p:plain

このゲームは、2人対戦ゲーム(≠play人数)である、ボードゲーム「キャプテンソナー」を元にしています。 互いに潜水艦を操縦し、先に相手のHPを0するか、300ターン経過時にHPが多い方が勝ちです。

ルール説明

潜水艦は海と島で構成される15×15マスの地図上を移動します。潜水艦は海上のみ動くことができ、潜水艦や機雷と同じセルを共有できます。 プレイヤーは互いに最初の地点を指定しゲームをスタートします。互いの開始位置は相手には知らされません。 マップは9セクターに分割され、1つ5x5マス、左上のセクター1から順番に番号が振られ右下のセクターが9です。

f:id:tsukammo:20200329073441p:plain
図:マップとセクター

各プレイヤーがターン毎に交互に行動します。あなたは対戦相手が何をしたかについて知ることができます。(例:北に移動した) 相手の位置を特定するためにこの貴重な情報を上手く活用しましょう。

アクション

ターン毎にあなたは必ず1つ以上のアクションを実行する必要があり、各アクションについて説明します。 パイプ"|"を使用してチェーンすることで、複数のアクションを同時に実行できます。ただし、各アクションは1ターンに1度しか使用できません。

移動(MOVE)

潜水艦を1マスだけ特定の方向(北、東、南、西)に移動します。 移動と同時に、他のアクション(魚雷、索敵、潜航、地雷)のパワーを充電することができます。島や移動済のマスに移動することはできません。

浮上(SURFACE)

移動済みのマスがリセットされ、以前に移動したマスに再度移動可能になります。 しかし、あなたの潜水艦のあるセクター番号が対戦相手に通知され、1HPを失います。

魚雷(TORPEDO):必要パワー3

魚雷を道のり4マス以内の任意の地点に発射します。島を迂回できますが通過はできません。 発射地点にいる潜水艦に2ダメージ、すべての隣接マス(対角線を含む)に1ダメージを与えます。 自分自身にもダメージが入ります。

f:id:tsukammo:20200329073545p:plain
図:魚雷の発射可能地点

索敵(SONAR):必要パワー4

指定したセクター内に敵潜水艦が存在するかどうかを確認します。 結果は次の自分のターンに得られますが、対戦相手が動いた後ではなくアクション実行時の位置です。

潜航(SILENCE):必要パワー6

上下左右の任意の方向に0~4マス直線移動します。通常の移動と同じく、島や移動済みのマスには移動できません。 対戦相手にはあなたが潜航したことしか通知されず、どの方向にどれだけ移動したかを知られずに移動できます。

機雷(MINE):必要パワー3

上下左右の隣接マスに機雷を設置します。同じマスに2つの地雷を設置することはできません。 ただし、対戦相手の潜水艦や地雷のあるマスに設置することは可能です。 地雷は、起爆アクションを使用する場合にのみ爆発し、設置マスを通過しても爆発しません。。

f:id:tsukammo:20200329073600p:plain
図:機雷

起爆(TRIGGER)

自身が設置した地雷を起爆します。ダメージは魚雷同様に、地雷の位置に2ダメージ、全ての隣接マス(対角線を含む)に1ダメージを与えます。 同じターンに複数の地雷を起爆することはできません。そのターンに設置した地雷を起爆することはできません。 自分自身にもダメージが入ります。

リーグ毎の開放

各アクションはリーグに応じて順次解法されていきます。

  • wood2:移動(MOVE)・浮上(SURFACE)・魚雷(TORPEDO)のみ
  • wood1:索敵(SONAR)と潜水(SILENCE)が追加
  • bronze:機雷(MINE)と起爆(TRIGGER)が追加

入出力

具体的な入出力内容について説明します。

開始時

島の位置("x")を示すマップ情報(15x15)を受け取ります。 互いのプレイヤーは、潜水艦の初期位置(x、y)を出力します。

各ターンの入力

3行の情報を受け取ります。

1行目:8つの整数値です。

  • x,y:自身の潜水艦の現在位置
  • myLife:自身のHP
  • oppLife:相手のHP
  • torpedoCooldown,sonarCooldown,silenceCooldown,mineCooldown:各アクションに必要な充電回数。 0で使用可能、-1はそのリーグでは使用不可。

2行目:索敵(SONAR)の結果を示す文字列です。

  • NA:索敵未使用時
  • Y:指定したセクターに敵艦が存在
  • N:指定したセクターには敵艦がいない

3行目:対戦相手がそのターン中に行ったアクションを示す文字列です。複数の場合、"|"で区切られます。
例:MOVE N | TORPEDO 3 5
この例は、対戦相手が上に移動してから、魚雷を地点(3,5)に発射したことを意味します。 対戦相手がまだ何もしていない場合はNAとなります。

各ターンの出力

あなたは"|"で区切られた1つ以上のアクションを出力します。アクションは先頭から順次処理されます。
例:MOVE N TORPEDO | TORPEDO 3 5
このコマンドは、潜水艦を上に移動した後、地点(3,5)に魚雷を発射します。

マップ生成

マップは下記のロジックで生成されます。

  • 一様ランダムにマップ上のマスを1つ選び、島を生成します。これを同じく一様ランダムに5~30回繰り返します。同じ地点を複数指定することもあります。
  • 島のあるマスに対して、右上方向に島を拡張します。そのため、基本的には最低4マスの島が形成されます。

f:id:tsukammo:20200329073615p:plain
図:島の拡張処理

第4回 RECRUIT 日本橋ハーフマラソン に参加しました。

下記の日時に開かれた競技プログラミングコンテスト、AtCoder「第4回 RECRUIT 日本橋ハーフマラソン」の備忘録です。

  • 予選:2020/02/15(土) 19:00 ~ 23:00 (240分)
  • 本戦:2020/03/07(土) 14:00 ~ 18:00 (240分)

f:id:tsukammo:20200326210327j:plain
第四回ハーフマラソン景品

結果

予選:1/525位、本戦:57/76位でした。※有効回答者のみカウント。
予選は生まれて初の優勝 & 初の本戦進出となり、嬉しかったので記念に参加記を書きます。

続きを読む