No.5017 Tool-assisted Shooting
タグ : / 解いたユーザー数 62
作問者 : platinum / テスター : yunix
ストーリー
ぷらちな君はとある縦スクロール型のシューティングゲームで遊んでいた。
画面下部の自機を左右に動かして画面上部から出現する敵機を攻撃するゲームである。
彼はこのゲームを繰り返し遊んだ結果、敵機の出現位置は完全なランダムではなく少し偏りがあり、
さらに毎回敵機が出現しやすい位置が変化していると感じていた。
適切に行動すれば更に高い得点を獲得できると考えた彼は、あなたにツールの開発を依頼した。
彼のために自機を操作するプログラムを作成してほしい。
問題文
本問題はリアクティブ形式である。
ゲームのフィールドは横$\ 25\ $マス、縦$\ 60\ $マスのグリッドで表現される。
一番左下のマスの座標を$(0,0)$とし、そこから右に$\ x\ $マス、上に$\ y\ $マス進んだマスの座標を$(x,y)$とする。
プレイヤーが操作できる自機は最初$(12,0)$に存在し、左右にのみ移動が可能である。
フィールドは左端と右端が繋がっている。すなわち左端の左隣のマスは右端、右端の右隣のマスは左端であるとする。
以下の一連の動作を$\ 1\ $ターンとし、ゲームは最大で$\ 1000\ $ターン続く。初期状態では敵機は存在しない。
- フィールドに存在する全ての敵機が下に$\ 1\ $マス移動する。フィールド外に移動した敵機は消滅する。
- 一番上の行に新たな敵機が出現する。出現確率は後述のように列ごとに定められている。
- 自機を左右いずれかに$\ 1\ $マス移動、またはその場にとどまる。
- 自機と同じ列に存在する敵機の中で自機に一番近い敵機を自動で攻撃する。
自機にはレベルが設定されており、最初レベルは$\ 1\ $である。また、敵機にはそれぞれ耐久力とパワーが設定されている。
自機が敵機を攻撃すると、その敵機の耐久力が自機のレベルの数値だけ減少する。耐久力が$\ 0\ $以下になった敵機は破壊され消滅する。
敵機が破壊された場合、その初期耐久力の数値が得点に加算される。 また、これまでに破壊した敵機のパワー$\ 100\ $ごとに自機のレベルが$\ 1\ $上昇する。
(すなわち、破壊した敵機のパワーの和を$\ S\ $とすれば、現在のレベルは$\ 1 + \lfloor S/100 \rfloor$となる)
ゲーム終了まで毎ターン敵機の出現情報が与えられるので、その度に自機の移動を出力せよ。
得点
ゲーム終了時点での得点がそのテストケースにおける得点となる。
自機の移動において指定されていない文字を出力した場合はWA
となる。
テストケースは全部で$\ 100\ $個あり、各テストケースの得点の合計が提出の得点となる。
コンテスト時間中に得た最高得点で最終順位が決定され、コンテスト終了後のシステムテストは行われない。
コンテストの順位は上の「スコア順」タブより確認できる。
ツール(ビジュアライザ等)
ビジュアライザやサンプルコードをGitHubより入手できます。
ビジュアライザの利用にあたっては、出力に#
から始まるコメント行を挿入できます。
ジャッジは#
から始まる行を無視するため、提出プログラムがコメント行を出力しても構いません。
ビジュアライザの任意の盤面のスクリーンショットや動画等をtwitter等で共有して構いません。
ハッシュタグは以下をご利用いただけると幸いです。
#ToolAssistedShooting
#yukicoder
入力
初期入力は与えられない。毎ターン敵機の出現情報が以下の形式で標準入力から与えられる。
はじめに出現する敵機の数$\ n\ $が与えられる。
$n$
$n=-1\ $の場合はゲームが終了したのでプログラムを直ちに終了せよ。
そうでない場合、$n\ $は$\ 0\ $以上$\ 25\ $以下の整数である。続いて以下の形式で敵機の情報が与えられる。
$h_1\ p_1\ x_1$ $h_2\ p_2\ x_2$ $\vdots$ $h_n\ p_n\ x_n$
$i\ $番目$(i=1,2,\dots,n)$の敵機は座標$(x_i,59)$に出現し、初期耐久力が$\ h_i\ $, パワーが$\ p_i\ $である。
各ターンにおける敵機は以下の制約を満たす。
- 入力は全て整数
- $1 \leq h_i$
- $0 \leq p_i$
- $0 \leq x_1 < x_2 \dots < x_n < 25$
ジャッジの入力を必ず最後まで全て受け取ること。そうしない場合
WA
となる可能性がある。
出力
毎ターン自機の移動を表す文字を出力せよ。出力する文字は以下のいずれかとせよ。
- 左に移動する場合は
L
- 右に移動する場合は
R
- その場にとどまる場合は
S
TLE
となる可能性がある。移動を表す文字を$\ 1000\ $回出力したら提出プログラムを終了せよ。
なお、ジャッジが$\ -1\ $を返した後に出力を行った場合の挙動は未定義である。
入力生成方法
$L\ $以上$\ U\ $以下の整数値を一様ランダムに生成する関数を$\ rand(L,U)\ $で表す。
平均$\ \mu$, 分散$\ \sigma^2\ $の正規分布から実数値をランダムに生成する関数を$\ norm(\mu,\sigma^2)\ $で表す。
- 各列の敵機の出現確率を、それぞれ独立に$\ P_i=rand(1,8)\ $とする(コンテストにおける入力では与えられない)。
- 毎ターン、列ごとに敵機の出現判定を行う。$i=0,1,\dots,24\ $に対し、左から$\ i+1\ $列目は$\ P_i\ $%の確率で新たに敵機が出現する。
- $T\ $ターン目に新たに出現する敵機では、以下のようにしてそれぞれ独立に耐久力$\ h\ $およびパワー$\ p\ $を決定する。
- $\mu=7.5+0.15T, \sigma=1.5+0.03T\ $とおく。
- $h'=norm(\mu, \sigma^2)\ $とし、$h=max(1,\lfloor h' \rfloor)\ $とする。
- $p'=norm(0.8h', (0.1h')^2)\ $とし、$p=max(0, \lfloor p' \rfloor)\ $とする。
プログラムを提出する際、$P\ $はコンテストにおける入力では与えられないことに注意せよ。
$P_0\ P_1\ \dots P_{24}$ $n_1$ $h_1\ p_1\ x_1$ $\vdots$ $h_{n_1}\ p_{n_1}\ x_{n_1}$ $\vdots$ $n_{1000}$ $h_1\ p_1\ x_1$ $\vdots$ $h_{n_{1000}}\ p_{n_{1000}}\ x_{n_{1000}}$
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。