このディレクトリの索引
#  [1] 授業単元: 情報処理
#  [2] 問題文(含コード&リンク):
#  テキストファイルの入力に対して行の文字数の短い順に並べて出力しなさい。
#  空行は出力しないこと。
#  
#  例)
#  abcd
#  abcdef
#  ab
#  abc
#  
#  出力結果:
#  ab
#  abc
#  abcd
#  abcdef

'テキストファイルの入力に対して行の文字数の短い順に並べて出力しなさい。空行は出力しないこと'(_ファイル) :-
        テキストファイルの入力(_ファイル,_テキストならび),
        行の文字数と行位置のならびを生成する(_テキストならび,_行の文字数と行位置のならび),
        短い順に並べて(_行の文字数と行位置のならび,_整列した行の文字数と行位置のならび),
        出力する(_テキストならび,_整列した行の文字数と行位置のならび),!.

テキストファイルの入力(_ファイル,_テキストならび) :-
        get_lines(_ファイル,_テキストならび).

行の文字数と行位置のならびを生成する(_テキストならび,_行の文字数と行位置のならび) :-
        findall([_文字数,_行位置],(
                   テキスト行を取り出し文字数と行位置を得る(_テキストならび,_文字数,_行位置)),
                _行の文字数と行位置のならび).

テキスト行を取り出し文字数と行位置を得る(_テキストならび,_文字数,_行位置) :-
         append(L0,[_テキスト行|_],_テキストならび),
         subatom(_テキスト行,0,_文字数,0,_テキスト行),
         行位置はL0の要素数よりひとつ大きな数(L0,_行位置).

行位置はL0の要素数よりひとつ大きな数(L0,_行位置) :-
        length([_|L0],_行位置).

短い順に並べて(_行の文字数と行位置のならび,_整列した行の文字数と行位置のならび) :-
        sort(_行の文字数と行位置のならび,_整列した行の文字数と行位置のならび).

出力する(_テキストならび,_整列した行の文字数と行位置のならび) :-
        整列した行から順に行位置を取り出し(_整列した行の文字数と行位置のならび,_行位置,_残り行ならび),
        行位置からテキスト行を取り出す(_行位置,_テキストならび,_テキスト行),
        writef('%t\n',[_テキスト行]),
        _残り行ならび = [].

整列した行から順に行位置を取り出し(_整列した行の文字数と行位置のならび,_行位置,_残り行ならび) :-
        append(_,[[_,_行位置]|_残り行ならび],_整列した行の文字数と行位置のならび).

行位置からテキスト行を取り出す(_行位置,_テキストならび,_テキスト行) :-
        nth1(_行位置,_テキストならび,_テキスト行).