このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1325685876/668
#  [1] 授業単元:ソート 
#  [2] 問題文(含コード&リンク): 
#  1. savadata.txt内にあるデータを読み取り、名前順にソートして 
#  全員分のLEVEL、PLAYER NAME、POINTを表示するプログラムを 
#  作成せよ. 
#   
#  2. savadata.txt内にあるデータを読み取り、レベル別にPOINTが上位3人までのPlayerNameとそのPOINTおよび 
#  レベル別の全体の平均点(Average)を表示させるプログラムを作成せよ. 
#   
#  出力例) 
#  ■EASY 
#  Rank1 : Tanaka            1000 POINT 
#  Rank2 : Onishi              875 POINT 
#  Rank3 : KItano              685 POINT 
#  Average : 256 POINT 
#   
#  ■Normal 
#  Rank1 : Kuriyama          900 POINT 
#  Rank2 : Onishi               775 POINT 
#  Rank3 : KItano               605 POINT 
#  Average : 232 POINT 
#   
#  savedata.txt 
#  http://ime.nu/www.kent-web.com/pubc/book/test/uploader/uploader.cgi?mode=downld&no=5099 
#            		    
#  HARD       Ichihashi                         230        
#  HARD       Tanaka                            170       
#  HELL       Nakamura                          10        
#  EASY       kanzaki                           130
#  HARD       Ichihashi                         20        
#  VERY HARD  Tamura                            570       
#  HELL       Ishii                             1000        
#  EASY       kanagawa                          200           
#  HARD       Kuriyama                          250        
#  DETH       Takeda                            180       
#  HELL       Nakanishi                         10        
#  NORMAL     kamida                            450
#  HARD       Iguchi                            290        
#  VERY HARD  Tanaka                            370       
#  DETH       Murata                            800        
#  VERY HARD  THirano                            290 
#  HARD       Kanemoto                          230        
#  NORNAL     Yano                              110       
#  HELL       Kuji                              10        
#  EASY       Arai                              130
#  EASY       Hamada                            20        
#  VERY HARD  Satoh                             120       
#  NORNAL     ishimura                          900        
#  EASY       Ushijima                          200 
#  HARD       Kumada                            230        
#  NORNAL     Nasuno                            820       
#  HELL       Hashimoto                         0        
#  EASY       Kim                               130
#  HARD       John                              20        
#  VERY HARD  Kimura                            170       
#  HARD       Nishioka                          470        
#  NORNAL     Honda                             400 
#  

'savadata.txt内にあるデータを読み取り、名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する' :-
        'savadata.txt内にあるデータを読み取り'(LL),
        '名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL).

'savadata.txt内にあるデータを読み取り'(LL) :-
        get_lines('savadata.txt',Lines),
        Lines = [_見出し|_実データならび],
        '各行をLEVEL,PLAYER NAME,POINTに分割する'(1,_実データならび,LL).

'各行をLEVEL,PLAYER NAME,POINTに分割する'(_,[],[]).
'各行をLEVEL,PLAYER NAME,POINTに分割する'(N,[_行|R1],[[N,_LEVEL,_PLAYER_NAME,_POINT]|R2]) :-
        split(_行,[' ','\t'],L),
        'LEVEL,PLAYER NAME,POINTに分割する'(L,_LEVEL,_PLAYER_NAME,_POINT),
        N2 is N + 1,
        '各行をLEVEL,PLAYER NAME,POINTに分割する'(N2,R1,R2).

'LEVEL,PLAYER NAME,POINTに分割する'(['VERY','HARD',_PLAYER_NAME,_POINT],'VERY HARD',_PLAYER_NAME,_POINT).
'LEVEL,PLAYER NAME,POINTに分割する'([_LEVEL,_PLAYER_NAME,_POINT],_LEVEL,_PLAYER_NAME,_POINT).

'名前順にソートして全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL) :-
        名前を順に(LL,LL1),
        ソートして(LL1,LL2),
        '全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL2,LL).

名前を順に(LL,LL1) :-
        '鍵(名前)と行番号の対を作る'(LL,LL1).

'鍵(名前)と行番号の対を作る'(LL,LL1) :-
        findall([_NAME,_行位置],(
                    member([_行位置,_LEVEL,_PLAYER_NAME,_POINT],LL)),
                LL1).

ソートして(LL1,LL2) :-
        整列(LL1,LL2).

'全員分のLEVEL、PLAYER NAME、POINTを表示する'(LL1,LL) :-
        append(_,[[_,_行番号]|R],LL1),
        nth1(_行番号_1,LL,[_,_LEVEL,_PLAYER_NAME,_POINT]),
        writef('%t %t %t\n',[_LEVEL,_PLAYER_NAME,_POINT]),
        R = [].