No.5017 Tool-assisted Shooting
タグ : / 解いたユーザー数 62
作問者 :

ストーリー
ぷらちな君はとある縦スクロール型のシューティングゲームで遊んでいた。
画面下部の自機を左右に動かして画面上部から出現する敵機を攻撃するゲームである。
彼はこのゲームを繰り返し遊んだ結果、敵機の出現位置は完全なランダムではなく少し偏りがあり、
さらに毎回敵機が出現しやすい位置が変化していると感じていた。
適切に行動すれば更に高い得点を獲得できると考えた彼は、あなたにツールの開発を依頼した。
彼のために自機を操作するプログラムを作成してほしい。
問題文
本問題はリアクティブ形式である。
ゲームのフィールドは横マス、縦マスのグリッドで表現される。
一番左下のマスの座標をとし、そこから右にマス、上にマス進んだマスの座標をとする。
プレイヤーが操作できる自機は最初に存在し、左右にのみ移動が可能である。
フィールドは左端と右端が繋がっている。すなわち左端の左隣のマスは右端、右端の右隣のマスは左端であるとする。
以下の一連の動作をターンとし、ゲームは最大でターン続く。初期状態では敵機は存在しない。
- フィールドに存在する全ての敵機が下にマス移動する。フィールド外に移動した敵機は消滅する。
- 一番上の行に新たな敵機が出現する。出現確率は後述のように列ごとに定められている。
- 自機を左右いずれかにマス移動、またはその場にとどまる。
- 自機と同じ列に存在する敵機の中で自機に一番近い敵機を自動で攻撃する。
自機にはレベルが設定されており、最初レベルはである。また、敵機にはそれぞれ耐久力とパワーが設定されている。
自機が敵機を攻撃すると、その敵機の耐久力が自機のレベルの数値だけ減少する。耐久力が以下になった敵機は破壊され消滅する。
敵機が破壊された場合、その初期耐久力の数値が得点に加算される。 また、これまでに破壊した敵機のパワーごとに自機のレベルが上昇する。
(すなわち、破壊した敵機のパワーの和をとすれば、現在のレベルはとなる)
ゲーム終了まで毎ターン敵機の出現情報が与えられるので、その度に自機の移動を出力せよ。
得点
ゲーム終了時点での得点がそのテストケースにおける得点となる。
自機の移動において指定されていない文字を出力した場合はWA
となる。
テストケースは全部で個あり、各テストケースの得点の合計が提出の得点となる。
コンテスト時間中に得た最高得点で最終順位が決定され、コンテスト終了後のシステムテストは行われない。
コンテストの順位は上の「スコア順」タブより確認できる。
ツール(ビジュアライザ等)
ビジュアライザやサンプルコードをGitHubより入手できます。
ビジュアライザの利用にあたっては、出力に#
から始まるコメント行を挿入できます。
ジャッジは#
から始まる行を無視するため、提出プログラムがコメント行を出力しても構いません。
ビジュアライザの任意の盤面のスクリーンショットや動画等をtwitter等で共有して構いません。
ハッシュタグは以下をご利用いただけると幸いです。
#ToolAssistedShooting
#yukicoder
入力
初期入力は与えられない。毎ターン敵機の出現情報が以下の形式で標準入力から与えられる。
はじめに出現する敵機の数が与えられる。
の場合はゲームが終了したのでプログラムを直ちに終了せよ。
そうでない場合、は以上以下の整数である。続いて以下の形式で敵機の情報が与えられる。
番目の敵機は座標に出現し、初期耐久力が, パワーがである。
各ターンにおける敵機は以下の制約を満たす。
- 入力は全て整数
ジャッジの入力を必ず最後まで全て受け取ること。そうしない場合
WA
となる可能性がある。
出力
毎ターン自機の移動を表す文字を出力せよ。出力する文字は以下のいずれかとせよ。
- 左に移動する場合は
L
- 右に移動する場合は
R
- その場にとどまる場合は
S
TLE
となる可能性がある。移動を表す文字を回出力したら提出プログラムを終了せよ。
なお、ジャッジがを返した後に出力を行った場合の挙動は未定義である。
入力生成方法
以上以下の整数値を一様ランダムに生成する関数をで表す。
平均, 分散の正規分布から実数値をランダムに生成する関数をで表す。
- 各列の敵機の出現確率を、それぞれ独立にとする(コンテストにおける入力では与えられない)。
- 毎ターン、列ごとに敵機の出現判定を行う。に対し、左から列目は%の確率で新たに敵機が出現する。
- ターン目に新たに出現する敵機では、以下のようにしてそれぞれ独立に耐久力およびパワーを決定する。
- とおく。
- とし、とする。
- とし、とする。
プログラムを提出する際、はコンテストにおける入力では与えられないことに注意せよ。
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。