このディレクトリの索引
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,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列),
        'さらに、学生の合格点で照準に整列して表示する(整列後)。'(_問いごとの合計点ならび,転置された学生の合格点付き点数行列).

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

'学生ごとの合格点と、問ごと合計点を求めて表示する(整列前)'(LL1,LL4,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列) :-
        '学生ごとの合格点と、'(LL1,_学生の合格点付き点数行列),
        '問ごと合計点を求めて'(_学生の合格点付き点数行列,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列),
        表示する(_学生の合格点付き点数行列,_問いごとの合計点ならび).

'学生ごとの合格点と、'([],[]).
'学生ごとの合格点と、'([[_学生番号|L1]|R1],[[_学生番号|L2]|R2]) :-
        sum(L1,_sum),
        学生ごとの合格点(L1,0,L2),
        '学生ごとの合格点と、'(R1,R2).

学生ごとの合格点([],_合計点,[_合計点]).
学生ごとの合格点([A|R1],_合計点_1,[A|R2]) :-
        _合計点2 is A + _合計点_1,
        学生ごとの合格点(R1,R2).

問ごと合計点を求めて(_学生の合格点付き点数行列,_問いごとの合計点ならび,_転置された学生の合格点付き点数行列) :-
        転置(_学生の合格点付き点数行列,_転置された学生の合格点付き点数行列),
        問ごと合計点(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび).

問ごと合計点([],[]).
問ごと合計点([L1|R1],[S|R2]) :-
        sum(L1,S),
        問ごと合計点(R1,R2).

表示する(_学生の合格点付き点数行列,_問いごとの合計点ならび) :-
        write('番号    問1   問2   問3   問4    問5  合計\n'),
        append(_,[L|R],_学生の合格点付き点数行列),
        writef('%5l%5r%5r%5r%5r%5r%5r\n',L),
        R = [],
        writef('     %5r%5r%5r%5r%5r%5r\n',_問いごとの合計点ならび).

'次に、問の合計点の降順に左から右に向かって整列し、さらに、学生の合格点で照準に整列して表示する(整列後)。'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび) :-
        '次に、問の合計点の降順に左から右に向かって整列し、'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび,LL_1),
        'さらに、学生の合格点で照準に整列して'(LL_1,LL_2),
        表示する_2(_問いごとの合計点ならび,LL_2).

'次に、問の合計点の降順に左から右に向かって整列し、'(_転置された学生の合格点付き点数行列,_問いごとの合計点ならび) :-
        順位づけする(_問いごとの合計点ならび,_順位づけされた合計点ならび),
        findall(L,(
                    between(1,5,N),
                    nth1(N,_順位づけされた合計点ならび,[_,_項目番号]),
                    nth1(_項目番号,_転置された学生の合格点付き点数行列,L)),
                LL_1),
        転置([_学生番号ならび|LL_1],LL_2).


'さらに、学生の合格点で照準に整列して'(LL1,LL2) :-
        findall([A|L],(
                    member(L,LL1),
                    last(L,A)),
                LL3),
        整列(LL3,LL4),
        鍵を切り離して逆順にならび替え(LL4,[],LL2).

鍵を切り離して逆順にならび替え([],LL,LL).
鍵を切り離して逆順にならび替え([[A|L]|R1],L_1,LL) :-
        鍵を切り離して逆順にならび替え(R1,[L|L_1],LL).

順位づけする(_問いごとの合計点ならび,_順位づけされた合計点ならび) :-
        findall([_合計点,_nth1],(
                    between(1,5,_nth1),
                    nth1(_nth1,_問いごとの合計点ならび,_合計点)),
                LL1),
        降順整列(LL1,_順位づけされた合計点ならび).

降順整列(LL1,_順位づけされた合計点ならび) :-
        整列(LL1,LL2),
        reverse(LL2,_順位づけされた合計点ならび).

表示する_2(LL_2,_順位づけられた合計点ならび) :-
        見出し表示(_順位づけられた合計点ならび),
        行列部分の表示(LL_2),
        合計点の表示(_順位づけられた合計点ならび).

見出し表示(_順位づけられた合計点ならび) :-
        findall(_項目番号,(
                    member([_,_項目番号],_順位づけられた合計点ならび)),
                _項目番号ならび),
        writef('番号 %5r%5r%5r%5r%5r%5r合計\n',_項目番号ならび).

行列部分の表示(LL) :-
        append(_,[L|R],LL),
        writef('%5l%5r%5r%5r%5r%5r%5r\n',L),
        R = [].

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