BlueLockのライバルリーって本当に終わるの?

# BlueLockのライバルリーって本当に終わるの?
ブルーロックという漫画がある。少年サッカー×デスゲーム物という新しいジャンルであり、漫画のみならずアニメ、ゲームと幅広く人気を博している、大人気コンテンツとなっている。
私はブルーロックが大好きなのだが、そんな中、一つ気になることがあった。
それは第二幕、ライバルリー戦の仕組みである。

## ライバルリー戦とは
Bluelockにおけるライバルリー戦の仕組みを簡単に説明しよう。

1. まず、3人一組のチームを複数作成する
2. 同じ人数のチーム同士で対戦する
3. 勝ったチームは負けたチームから一人選んで自分のチームに加え、負けたチームは一人失う
4. 2と3を繰り返し5人に達したチームは勝ち抜け、1人になってしまったチームは脱落する

これが基本的なルールである。

## 疑問
これ、本当に終わるの？

至極単純な疑問である。初めて読んだときはそれまでの漫画の展開でフィーチャーされてきた人しか残らなかったのでふーんとしか思っていなかったが、読み直すたびにこれ多分2人チームが一つだけとかになってうまく行かないよな......と思うようになっていった。

## 検証
簡単にシミュレーションしてみることで試してみることにしよう。
と思ったところ、もっと大きな問題にぶち当たってしまった。
このゲーム、開始人数が125人なのである。そもそも、3人で割れないのかい！！！！！！！完全に破綻してるじゃねーか！！！！
開始から2人のチームを想定するとしても悲惨だ。最初から負けたら終わりの状態で戦わないといけない。こんなところでもチームを組むのが遅れるやつはひどい扱いを受けるのか。小学校じゃねぇんだよ。
仕方がないので最初に2人で始める人が出てきてしまうことについては目をつむってシミュレーションを行うこととする。

なお、シミュレーションのコードは次のとおりである。Pythonで実装している。

~~~Python
from collections import Counter


def simulate_game(teams):
    game_round = 1
    winners_through = 0
    eliminated_through = 0

    while len(teams) > 1:
        print(
            f"ラウンド {game_round}: チーム数 = {len(teams)}, 構成 = {dict(Counter(teams))}"
        )

        # 同じサイズのチームをグループ化
        teams_by_size = {}
        for team_size in teams:
            if team_size not in teams_by_size:
                teams_by_size[team_size] = 0
            teams_by_size[team_size] += 1

        new_teams = []
        winners = 0
        eliminated = 0

        # 各サイズのチームで試合
        for size, count in teams_by_size.items():
            # 1人チームは脱落
            if size == 1:
                eliminated += count
                continue

            # 5人チームは勝ち抜け
            if size == 5:
                winners += count
                continue

            # 同じサイズのチームで試合
            pairs = count // 2  # 対戦できるペアの数
            remainder = count % 2  # 余りのチーム

            # 各ペアで試合
            for _ in range(pairs):
                # 勝者は+1人、敗者は-1人
                new_teams.append(size + 1)
                if size - 1 > 1:  # 敗者チームが2人以上ならチームとして残る
                    new_teams.append(size - 1)
                else:  # 敗者チームが1人になったら脱落
                    eliminated += 1

            # 余りのチームはそのまま次のラウンドへ
            if remainder:
                new_teams.append(size)

        # チームリストを更新
        teams = new_teams

        if winners > 0:
            print(f"  勝ち抜け: {winners}チーム")
            winners_through += winners
        if eliminated > 0:
            print(f"  脱落: {eliminated}チーム")
            eliminated_through += eliminated

        game_round += 1

        # 無限ループ防止
        if game_round > 50 or len(teams) == 0:
            print("50ラウンド以上経過したかチーム数が0になったため終了")
            break

    print(
        f"ゲーム終了: 残りチーム数 = {len(teams)}, 構成 = {dict(Counter(teams)) if teams else 'なし'}, 勝ち抜け人数 = {winners_through * 5}, 脱落人数 = {eliminated_through}"
    )


# 初期設定：3人チームが41個、2人チームが1個
teams = [3] * 41 + [2]
# シミュレーション実行
simulate_game(teams)
~~~

## 結果

~~~bash
ゲーム終了: 残りチーム数 = 2, 構成 = {3: 1, 2: 1}, 勝ち抜け人数 = 100, 脱落人数 = 20
~~~

だよね～～～～～～～～～～～
残るよね～～～～～～～～～～
しかも勝ち抜け人数多～～～～

そうなのだ、このゲーム勝ち抜け時5人いなくなって脱落時は1人ずつしかいなくならないので、そんなに脱落しないのである。國神もなかなかレアな確率の下で非人道的な肉体改造をされたのである。かわいそう。
ちなみに本誌では35人しか生き残っておらずこの間に何が起こったのかはよくわかっていない。

## まとめ
とりあえず、記載されているルールだけでは明らかに辻褄が合わないことがわかった。
時間があれば35人生き残るのが妥当になるようなルールを見つけたいところである。