AtCoder ABC 045 B – 3人でカードゲームイージー Python解説

2021年11月21日

スポンサーリンク

3人でカードゲームイージー

A さん、B さん、C さんの 3人が以下のようなカードゲームをプレイしています。

最初、3人はそれぞれ abc いずれかの文字が書かれたカードを、何枚か持っている。これらは入力で与えられた順番に持っており、途中で並べ替えたりしない。
A さんのターンから始まる。
現在自分のターンである人がカードを 1枚以上持っているならば、そのうち先頭のカードを捨てる。その後、捨てられたカードに書かれているアルファベットと同じ名前の人 (例えば、カードに a と書かれていたならば A さん) のターンとなる。
現在自分のターンである人がカードを 1枚も持っていないならば、その人がゲームの勝者となり、ゲームは終了する。

最終的に誰がこのゲームの勝者となるかを求めてください。

AtCoder株式会社 AtCoder Beginner Contest 045

例題がわかりやすかったのでこちらも見てみましょう。

入力例

aca
accc
ca

出力例

A

ゲームは以下のように進行します。

A さんが、持っている中で最初のカード a を捨てる。次は A さんの番となる。
A さんが、持っている中で最初のカード c を捨てる。次は C さんの番となる。
C さんが、持っている中で最初のカード c を捨てる。次は C さんの番となる。
C さんが、持っている中で最初のカード a を捨てる。次は A さんの番となる。
A さんが、持っている中で最初のカード a を捨てる。次は A さんの番となる。
A さんはもう持っているカードがない。よって A さんの勝利となり、ゲームは終了する。

AtCoder株式会社 AtCoder Beginner Contest 045

上記をコードにしていきましょう。気を付けたいポイントは、カードを捨てたタイミングではゲーム終了にならず、カードがなくなって次に順番が回ってきたときにゲームが終了するところでしょうか。

s_a = input()
s_b = input()
s_c = input()

# *1
turn = "a"

while True:
    if turn == "a":
        # *2
        if len(s_a) > 0:
            # *3
            turn, s_a = s_a[0], s_a[1:]
        else:
            print("A")
            break
            
    elif turn == "b":
        if len(s_b) > 0:
            turn, s_b = s_b[0], s_b[1:]
        else:
            print("B")
            break
            
    elif turn == "c":
        if len(s_c) > 0:
            turn, s_c = s_c[0], s_c[1:]
            
        else:
            print("C")
            break

*1 このゲームではAさんの順番から始まるということで、turn="a"を用意しました。

*2 カードをまだ持っているかをlen関数で確認し、まだカードを持っていれば*3に続きます。持っていなければその時点で勝利者を出力し、breakでループを終了します。

*3 スライスを使って先頭の文字(次の順番)、残りのカードに分けます。
下にスライスを使ったときのサンプルを記述しています。

sample = "abc"

turn, sample = sample[0], sample[1:]  #a, bcに分けられる