# -*- coding: utf-8 -*-
"""
バブルソート（降順）
"""


import random


# 整数乱数（0-19）のlistを作成
def make_ints_r(n):
    x = []
    for i in range(n):
        x.append(random.randrange(20))
    return x


# ランダムな英数文字列（２文字）のlistを作成
def make_strs(n):
    c_map = list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
    c_len = len(c_map)
    s = []

    for i in range(n):
        c_tmp = ""
        for j in range(2):
            c_tmp += c_map[random.randrange(c_len)]
        s.append(str(c_tmp))
    return s


# データ列（整数）を文字列化
# 分かりやすさのため，一部を色付け（ターミナル上）
def ints_to_str(x, m=[]):
    x_strs = []  # 文字列化されたデータ列を保持するlist
    for i in range(len(x)):
        # インデックスがmに含まれていれば背景を赤色に
        if i in m:
            x_strs.append(f"\x1b[4;101m{x[i]:2d}\x1b[0m")
        else:
            x_strs.append(f"{x[i]:2d}")
    # 結合して戻す
    return ",".join(x_strs)


# 目盛を表示
# 分かりやすさのため，全て色付け（ターミナル上）
def print_index(n):
    # 目盛をlistで準備
    tics = [f"{i:2d}" for i in range(n)]
    # 背景を青色にしつつ結合し表示
    print("index\x1b[4;104m " + ",".join(tics) + "\x1b[0m")


# バブルソート
# データ列を整列する（途中経過も出力）
# x: list（整数）
# s: list（文字列）
# 引数において各listが参照として渡されるため
# 関数内部で並べ替えれば呼び出し元でも並び変わり
# 戻り値が不要となる
""" 指示ここから """
# xの要素と連動して，対応するsの要素も並び替わるよう
# メソッド bubble_sort() を修正しなさい．
def bubble_sort(x, s):
    cnt = 0         # 交換回数
    n = len(x) - 2  # 範囲の幅

    for li in range(n+1):             # 範囲は徐々に右に絞る
        for j in range(n, li-1, -1):  # 比較位置は徐々に左に
            if x[j] < x[j+1]:  # 左＜右なら　※この行のみ改変
                x[j], x[j+1] = x[j+1], x[j]  # 交換
                s[j], s[j+1] = s[j+1], s[j]  # 交換
                cnt += 1
                # 交換位置を赤色で表示
                print(f"[{cnt:03d}]", ints_to_str(x, [j, j+1]))
""" 指示ここまで """


def main():
    # 乱数を準備
    try:
        # 整数が入力された場合は，それを種とする
        rnd_seed = int(input("乱数の種（入力が整数以外なら自動設定）："))
        random.seed(rnd_seed)
    except ValueError:
        # 整数でなかった場合は，デフォルト（自動設定）
        pass
    print()  # 採点の都合上の空行 

    # 各データの準備
    n = 30
    x = make_ints_r(n)  # 整数のデータ列
    s = make_strs(n)    # 対応する文字列の列

    # ヘッダー部を表示
    print_index(n)
    print("val_1", ints_to_str(x))
    print("val_2", ",".join(s))

    # バブルソートを実施
    bubble_sort(x, s)

    # 結果を表示
    print("val_1", ints_to_str(x))
    print("val_2", ",".join(s))
    print_index(n)


if __name__ == "__main__":
    main()
