このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1349527750/693
#  [1]C/C++プログラミング実習 まとめ  
#  [2]問題 http://ime.nu/codepad.org/CfJninhf 
#    問題文中に出てくる histograms.txt
#  [3]visual studio 2010 
#  [4]11月19日 10時 
#  [5]前にここのスレでお世話になりました../test/read.cgi/tech/1349527750/603です。 
#    この前の課題を提出した所、今度はまとめとして前の問題の発展問題がだされました。 
#    前に頂いたプログラムを改変してみようと思ったのですが、今回の問題が複雑になりすぎてて 
#    お手上げ状態です。どなたか助けていただけると幸いに思います。 
# 
#  /*
#  histograms.txtという文章ファイルがある。
#  このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が
#  並んでいて、それらの数字は水平TAB文字によって区切られている。
#  このhistograms.txtを自動的に以下の条件のもとに改変して
#  train.datというファイルとして出力をするプログラムを作れ。
#  
#  条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。
#      (例 image/0-21C5N550AVL.jpg → 0
#         image/1-19690369.jpg  → 1
#         image/2-24891960.jpg  → 2
#         image/3-12725422.jpg  → 3)
#  
#  条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。
#  
#  条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、
#      番号:数値?番号:数値?番号:数値?…という形に書き換える
#      (例 0 	0.0309051	0	0   0.00496689 
#       → 2:0.0309051 5:0.00496689 …… )
#  
#  条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き
#               指定した方の名前で出力を行う。
#  
#  */

'histograms.txtという文章ファイルがある。
このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が
並んでいて、それらの数字は水平TAB文字によって区切られている。
このhistograms.txtを自動的に以下の条件のもとに改変して
train.datというファイルとして出力をするプログラムを作れ。

条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。
    (例 image/0-21C5N550AVL.jpg → 0
       image/1-19690369.jpg  → 1
       image/2-24891960.jpg  → 2
       image/3-12725422.jpg  → 3)

条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。

条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、
    番号:数値?番号:数値?番号:数値?…という形に書き換える
    (例 0 	0.0309051	0	0   0.00496689 
     → 2:0.0309051 5:0.00496689 …… )

条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き
             指定した方の名前で出力を行う。' :-
        'histograms.txtという文章ファイルがある。このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が並んでいて、それらの数字は水平TAB文字によって区切られている。このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする'.

'histograms.txtという文章ファイルがある。このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が並んでいて、それらの数字は水平TAB文字によって区切られている。このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする' :-
        'このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする'.

'このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする' :-
        'histograms.txtを項区切りの情報に変換する'(LL0),
        '条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。'(LL0,LL1),
        '条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、'(LL1,LL3),
        '条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。'(LL3,_行ならび),
        '条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(LL3).

'histograms.txtを項区切りの情報に変換する'(LL0) :-
        get_split_lines('histograms.txt',['\t'],LL0).

'条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。'(LL0,LL1) :-
        findall([N|R],(
                    member([File|R],LL0),
                    split(File,['/','-'],[_,N|_])),
                LL1).

'条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、'(LL2,LL3) :-
        findall([N|L],(
                    member([N|R],LL2),
                    左から順に番号を振った上で要素が0のものを削除し(R,L)),
                LL3).

左から順に番号を振った上で要素が0のものを削除し(L1,L) :-
        findall(Nth:A,(
                    append(L0,[A|_],L1),
                    \+(A = 0),
                    length([_|L0],Nth)),
                L).

'条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。'(LL1,L) :-
        findall(S,(
                    member(L,LL1),
                    atomic_list_concat(LL1,' ',S)),
                L).

'条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(_行ならび) :-
        'train.datかtest.datのどちらのファイル名で出力するかを聞き',
        整数を得る('1または2のどちらかの数字',(N>=1,N=<2),N),
        指定した方の名前で出力を行う(N,_指定した方の名前).

'train.datかtest.datのどちらのファイル名で出力するかを聞き' :-
        write('ファイル名を選択します。\n1.. train.dat  2.. test.dat \n').

指定した方の名前で出力を行う :-
        指定した方の名前で(_指定した方の名前),
        出力を行う(_指定して方の名前,_行ならび).

指定した方の名前で(_指定した方の名前) :-
        整数を得る('1または2',(N == 1;N == 2),N),
        指定した方の名前で(N,_指定した方の名前).

指定した方の名前(1,'train.dat').
指定した方の名前(2,'test.dat').

出力を行う(_指定した方の名前,_行ならび) :-
        put_lines(_指定した方の名前,_行ならび).