# -*- 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（文字列）
""" 指示ここから """
# xの要素と連動して，対応するsの要素も並び替わるよう
# 関数 selection_sort() を修正しなさい．
def selection_sort(x, s):
    cnt = 0         # 交換回数
    n = len(x) - 1  # 範囲の幅

    for li in range(n):  # 範囲は徐々に右に絞る
        k = li  # 最小値の位置を範囲の左端で初期化
        # 最小値を探索
        for j in range(li+1, n+1):  # 比較位置は徐々に左に
            if x[j] < x[k]:   # 現在の最小値より小さいなら
                k = j         # 最小値の位置を更新
        
        x[li], x[k] = x[k], x[li]  # 範囲の左端と最小値を交換
        s[li], s[k] = s[k], s[li]  # 交換
        cnt += 1
        print(f"[{cnt:03d}]", ints_to_str(x, [li, k]))
""" 指示ここまで """


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))

    # 選択ソートを実施
    selection_sort(x, s)

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


if __name__ == "__main__":
    main()
