このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1357748713/227
#  [1] 授業単元: 配列の整列 
#  [2] 問題文(含コード&リンク):字数超えてしまったのでリンク張ります。
#  [ http://ime.nu/codepad.org/YCoV3saL ] 
#  
#  /*
#  
#  2次元配列の整列
#  
#  ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。
#  
#                 | 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | 
#  
#  これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前)
#  次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合計点で照準に整列して表示する(整列後)。
#  
#  【実行例】
#  
#  整列前
#  番号    問1   問2   問3   問4    問5  合計
#  1001   20    30    49    41    90   230
#  1002   50    30    24     0    95   199
#  1003   20    33    55    35    90   233
#  1004   93    55    56    61    90   355
#   ・     ・     ・     ・     ・     ・     ・
#   ・     ・     ・     ・     ・     ・     ・
#   ・     ・     ・     ・     ・     ・     ・
#  1025   80    90    52    50    91   363
#  合計  1145  1015  1297   978  2292
#  
#  整列後
#  番号    問5   問3   問1   問2    問4  合計
#  1025   91    52    80    90    50   363
#  1004   90    56    93    55    61   355
#  1003   90    50    94    50    49   233
#  1004  100    49    70    30    62   311
#   ・     ・     ・     ・     ・     ・     ・
#   ・     ・     ・     ・     ・     ・     ・
#   ・     ・     ・     ・     ・     ・     ・
#  1015   90    53    20    20     0   183
#  合計  2292  1297  1145   1015   978
#  
#  ※実行例が長くなってしまうので途中省略しています。
#  
#  */

'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。
| 学生番号 | 問1の点数 | 問2の点数 | 問3の点数 | 問4の点数 |問5の点数 | 
これを入力し、学生ごとの合格点と、問ごと合計点を求めて表示する(整列前)
次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。' :-
        'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1),
        '学生ごとの合格点と、問ごと合計点を求めて表示する'(LL1,LL2),
        '次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(LL2).

'ファイル"seiseki.dat"[ http://db.tt/GRBKqdNF ]には、テストの各問の点数が以下のフォーマットで記録されている。これを入力し、'(LL1) :-
        get_split_lines('seiseki.dat',[' '],LL1).

'学生ごとの合格点と、問ごと合計点を求めて表示する'(LL1,LL2) :-
        '行列を列の合計で降順に整列して列位置を交換し(LL1,LL2),
        問いごとの合計を表示する(LL2).

列の合計で降順に整列して列位置を交換し(LL,LL1) :-
        転置(LL,_転置されたLL),
        findall([_合計,_nth1|L],(
                    nth1(_nth1,_転置されたLL,L),
                    sum(L,_合計)),
                _転置され合計を付加されたLL),
        降順バブルソート(_転置され合計と列位置が付加されたLL,_降順に整列された転置され合計と列位置が付加されたLL),
        転置(_降順に整列された転置され合計と列位置が付加されたLL,LL1).

問いごとの合計を表示する(LL2) :-
        between(1,6,_nth),
        nth0(_nth,LL2,[_合計|_]),
        atomic_list_concat([問,_nth,' = ',_合計],S),
        writef('  %t,',[S]),
        _nth = 6,
        write('\n').

'次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(LL1) :-
        列の合計で降順に整列して列位置を交換し(LL1,LL2),
        行合計で降順に整列する(LL2,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL),
        表示する(_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL).

行合計で降順に整列する(LL1,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL) :-
        findall([_合計|L2],(
                    member(L,LL1),
                    要素の合計を最終要素に付加(L,_合計,L2)),
                LL2),
        降順バブルソート(LL2,_降順に整列された各行の先頭列に合計が付加され各列の先頭行から合計と列位置が付加されたLL).

要素の合計を最終要素に付加(L1,_合計,L2) :-
        要素の合計を最終要素に付加(L1,0,_合計,L2).

要素の合計を最終要素に付加([],_合計,_合計,[_合計]).
要素の合計を最終要素に付加([N|R1],_合計_1,_合計,[N|R2]) :-
        _合計_2 is _合計 + N,
        要素の合計を最終要素に付加(R1,_合計_2,_合計,R2).

表示する(LL2) :-
        最終見出しを得る(LL2,_見出し),
        writef('%t\n',[_見出し]),
        行列部分の表示(LL2),
        最終合計の表示(LL2).        
        
行列部分の表示(LL) :-
        append(_,[[_|L]|R],LL),
        writef('%5l%5r%5r%5r%5r%5r%5r\n',L),
        R = [].

最終合計の表示([_最終合計ならび|_]) :-
        writef('     %5r%5r%5r%5r%5r%5r\n',_最終合計ならび).
        
合計点の表示(_順位づけられた合計点ならび) :-
        findall(_合計点,(
                    member([_合計点,_],_順位づけられた合計点ならび)),
                _合計点ならび),
        writef('     %5r%5r%5r%5r%5r%5r\n',_合計点ならび).


最終見出しを得る([_,L|_],_最終見出し) :-
        findall(S,(
                    member(N,L),
                    atomic_list_concat(['問',_nth1,' '],S)),
                L),
        atomic_list_concat(['番号 '|L],_最終見出し).

降順バブルソート(L1,L2) :-
        append(L0,[A,B|R],L1),
        A @< B,
        append(L0,[B,A|R],L3),
        降順バブルソート(L3,L2),!.
降順バブルソート(L,L).