No.2539 スライムゲーム
タグ : / 解いたユーザー数 9
作問者 : 👑 p-adic / テスター : ecottea
注意
この問題の実行時間制限は1000[ms]です。
問題文
$2$ 種類の文字(
と)
のみからなる文字列をここではスライムと呼びます。
空文字列であるスライムを死んだスライムと呼びます。死んだスライムでないスライムを生きたスライムと呼びます。
スライムが完全なスライムであるということを以下のように再帰的に定義します:
- 死んだスライムは完全なスライムである。
- 任意の完全なスライム $s_0$ と $s_1$ に対し、$s_0$ と $s_1$ をこの順に結合した文字列 $s_0 s_1$ であるスライムは完全なスライムである。
- 任意の完全なスライム $s$ に対し、
(
と $s$ と)
をこの順に結合した文字列(
$s$)
であるスライムは完全なスライムである。
以下、集合などの再帰的定義について詳しくない人向けの説明を書きます。(クリックで開く)
$X$ を集合とします。例えば $X$ は特定の文字のみからなる文字列の集合などです。今回説明するのは、$X$ の部分集合などを再帰的に定義する際の数学特有の言い回しです。
例えば $X$ の要素 $c$ と非負整数 $n_0,m_0,n_1,m_1$ と写像 $F_0 \colon X^{n_0} \times X^{m_0} \to X$ と $F_1 \colon X^{n_1} \times X^{m_1} \to X$ を用いて次のような書き方をすることがあります:
$X$ の部分集合 $A$ を以下のように再帰的に定める:
- $c \in A$ である。
- 任意の $(a,t) \in A^{n_0} \times X^{m_0}$ に対し、$F_0(a,t) \in A$ である。
- 任意の $(a,t) \in A^{n_1} \times X^{m_1}$ に対し、$F_1(a,t) \in A$ である。
これはあくまで例であって、今回は $3$ つの条件としましたが一般には $3$ つとは限りませんし、写像を用いるのではなく関係を用いることもあります。再帰的定義の一般の定式化[1] 6.1.1 Definitionはかなり抽象的なので、今回はこの問題を解く上で必要な例のみを考えることにします。
ここで重要なのは、この定義文は $A$ が単に $3$ つの条件を全て満たす $X$ の任意の部分集合であるという意味を持つのではなく、次の定義文を表すということです:[1] 6.1.2 Definitionおよびその直後の段落参照
$X$ の部分集合 $A$ を、以下の $3$ 条件を全て満たす $X$ の部分集合 $B$ 全体の共通部分と定める:
- $c \in B$ である。
- 任意の $(a,t) \in B^{n_0} \times X^{m_0}$ に対し、$F_0(a,t) \in B$ である。
- 任意の $(a,t) \in B^{n_1} \times X^{m_1}$ に対し、$F_1(a,t) \in B$ である。
$B = X$ とすると確かに上の $3$ 条件を満たすので、条件を満たす $B$ 全体の集合は空でなく共通部分が定義されます。そして $A$ は $3$ 条件を満たす $B$ のうち最小のものである、ということが結果的に従います。
このように、部分集合の再帰的定義はただの条件の列挙ではなく最小性も含意するよう約束されていることに注意しましょう。ただしこれはあくまで再帰的定義に限った約束であり、通常の定義では最小性はもちろん含意されませんし、そもそも再帰的定義のような自己言及を通常の定義で行うと多くの場合循環論法となり定義が破綻します。
さて、$X$ 上の $1$ 項関係は $X$ の部分集合と等価であるため、$X$ 上の $1$ 項関係の再帰的定義においても同様の規則が適用されます。具体的には、
$X$ の要素が良い項であるということを以下のように再帰的に定める:
- $c$ は良い項である。
- 任意の $(a,t) \in X^{n_0} \times X^{m_0}$ に対し、$a$ の任意の成分が良い項であるならば、$F_0(a,t)$ も良い項である。
- 任意の $(a,t) \in X^{n_1} \times X^{m_1}$ に対し、$a$ の任意の成分が良い項であるならば、$F_1(a,t)$ も良い項である。
のように「良い項である」という $1$ 項関係の再帰的定義を書いた場合、これは「良い項である」という述語が $3$ 条件を満たす任意の $1$ 項関係を表すという意味ではありません。上の定義文は次の定義文と等価なものになります:
$X$ の要素 $x$ が良い項であるということを、以下の $3$ 条件を全て満たす $X$ の任意の部分集合 $B$ に対し $x \in B$ が成り立つということと定める:
- $c \in B$ である。
- 任意の $(a,t) \in B^{n_0} \times X^{m_0}$ に対し、$F_0(a,t) \in B$ である。
- 任意の $(a,t) \in B^{n_1} \times X^{m_1}$ に対し、$F_1(a,t) \in B$ である。
以上を踏まえると、今回の完全なスライムの再帰的定義は次の定義文と等価です:
スライム $s$ が完全なスライムであるということを、スライムのみからなる任意の集合 $B$ に対し $B$ が以下の $3$ 条件を全て満たすならば $s \in B$ が成り立つということと定める:
- 空文字列は $B$ の要素である。
- $B$ の任意の要素 $t_0$ と $t_1$ に対し、$t_0$ と $t_1$ をこの順に結合した文字列は $B$ の要素である。
- $B$ の任意の要素 $t$ に対し、
(
と $t$ と)
をこの順に結合した文字列は $B$ の要素である。
元の言い回しと比べてだいぶ複雑な言い回しとなりましたね。このような複雑な言い回しを避けるために、数学では今回紹介した簡潔な言い回しが定義され採用されているわけです。
例えば後で参考文献として挙げる
- [1] における$1$ 項関係「be an $\mathcal{L}$-term」や「be an $\mathcal{L}$-formula」の再帰的定義など
- [2] における集合 $T$ および $1$ 項関係「be a principal term」の再帰的定義など
- [3] における集合 $B(\alpha,\beta)$ や $\textrm{K}_{\kappa}(\gamma)$ の再帰的定義など
で実際にそういった言い回しが採用されています。
参考文献
- W. Pohlers, "Proof Theory - The first step into impredicativity", Springer, 2010.
- W. Buchholz, "A New System of Proof-Theoretic Ordinal Functions", Annals of Pure and Applied Logic 32 (1986), pp. 195--207.
- M. Rathjen, "Ordinal Notations Based on a Weakly Mahlo Cardinal", Archive for Mathematical Logic 29 (1990), pp. 249--263.
スライム $s$ に攻撃するとは、以下で再帰的に定義されるスライム $\Sigma s$ で $s$ を置き換えるということです:
- あるスライム $t$ と完全なスライム $u$ が存在して $s$ が $t$ と
(
と $u$ と)
をこの順に結合した文字列 $t$(
$u$)
であるとする。 - $u$ が死んだスライムであるならば、$\Sigma s = t$ である。
- $u$ が生きたスライムであるならば、$t$ と
(
と $\Sigma u$ と)(
と $\Sigma u$ と)
をこの順に結合した文字列 $t$(
$\Sigma u$)(
$\Sigma u$)
であるスライムを $v$ と置くと、$\Sigma s = \Sigma v$ である。 - そうでないならば、$\Sigma s$ は死んだスライムである。
ただし上記の分岐1における $t$ と $u$ の組み合わせは一意であることが知られており、$\Sigma s$ が一意に定まることは保証されています。
$s$ が退治可能であるとは、$s$ に $10^{18}$ 回攻撃すると $s$ が死んだスライムとなるということです。
$s$ が退治可能である場合、$s$ を死んだスライムに置き換えるために必要な攻撃回数の最小値を $s$ のHPと呼びます。例えば $s$ が最初から死んだスライムである場合、$s$ のHPは $0$ です。
入力にスライム $S$ が与えられます。
$S$ が退治可能であるか否かを判定し、退治可能である場合はそのHPを求めてください。
入力
入力は次の形式で標準入力から与えられます:
$S$
制約
入力は以下の制約を満たします:
- $S$ は文字列としての長さが $1$ 以上 $10^5$ 以下のスライム
出力
$S$ が退治可能でない場合はINFTY
と出力し、退治可能である場合はそのHPを $1$ 行に出力してください。
最後に改行してください。
サンプル
サンプル1
入力
(
このように(
と)
の個数が一致しないこともあります。
出力
1
(
に攻撃するとそれが死んだスライムに置き換わります。
サンプル2
入力
()()
出力
2
()()
に攻撃するとそれが生きたスライム()
に置き換わります。
()
に攻撃するとそれが死んだスライムに置き換わります。
サンプル3
入力
(()
出力
2
(()
に攻撃すると生きたスライム(
に置き換わります。()
には置き換わらないことに注意してください。
(
に攻撃すると死んだスライムに置き換わります。
サンプル4
入力
(())
出力
2
(())
に攻撃すると生きたスライム()
に置き換わります。
()
に攻撃すると死んだスライムに置き換わります。
サンプル5
入力
(((((((((())))))))))
出力
INFTY
(((((((((())))))))))
は退治可能でないのでINFTY
と出力してください。
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。