# -*- coding: utf-8 -*-
"""
データの並べ替え（プログラム）
"""
# これは，難易度２を達成するプログラムのソースコードです．


import random


# ファイル「data.txt」からデータを読み込み
def load_data():
    fr = open("data.txt", "r", encoding="UTF-8")
    line_list = fr.readlines()
    x = []
    for line in line_list:
        data = line.split(",")
        try:
            num_int = int(data[1])
        except ValueError:
            break
        else:
            if 0 <= num_int <= 999:
                x.append([data[0].strip(), num_int])

    return x


# データを表示
def print_data(x):
    for line in x:
        print(f"{line[0]:3}, {line[1]}")


# 昇順
def selection_sort_a(x):
    n = len(x) - 1  # 範囲の幅

    for li in range(n):  # 範囲は徐々に右に絞る
        k = li  # 最小値の位置を範囲の左端で初期化
        # 最小値を探索
        for j in range(li+1, n+1):  # 比較位置は徐々に左に
            if x[j][0] < x[k][0]:   # 現在の最小値より小さいなら
                k = j         # 最小値の位置を更新
        
        x[li], x[k] = x[k], x[li]  # 範囲の左端と最小値を交換


# 降順
def selection_sort_d(x):
    n = len(x) - 1  # 範囲の幅

    for li in range(n):  # 範囲は徐々に右に絞る
        k = li  # 最大値の位置を範囲の左端で初期化
        # 最大値を探索
        for j in range(li+1, n+1):  # 比較位置は徐々に左に
            if x[j][0] > x[k][0]:   # 現在の最大値より小さいなら
                k = j         # 最大値の位置を更新
        
        x[li], x[k] = x[k], x[li]  # 範囲の左端と最大値を交換


# Fisher-Yatesのシャッフルアルゴリズム
def fy_shuffle(x):
    n = len(x) - 1  # 範囲の幅

    for i in range(n):  # 交換元は徐々に右に
        j = random.randint(i, n)  # 交換先を乱数で決定
        x[i], x[j] = x[j], x[i]   # 交換


def main():
    x = load_data()

    order = input("出力形式を選んで下さい。[a]昇順、[d]降順、[s]シャッフル：")
    print()  # 採点の都合上の改行

    if   order == "d":  # 「d」が入力されたら降順
        selection_sort_d(x)
        print("降順に出力します")
    elif order == "s":  # 「s」が入力されたらシャッフル
        fy_shuffle(x)
        print("シャッフルして出力します")
    else:               # それ以外なら昇順
        selection_sort_a(x)
        print("昇順に出力します")
    
    # 数値列を出力
    print_data(x)
    
    input("\nEnterを押してプログラムを完全終了")


if __name__ == "__main__":
    main()
