このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1245853701/ 
# [1] 授業単元:C言語実習 
# [2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin 
/joyful/img/9658.txt 
# {5,21,4,14,12}, 
# {25,20,15,3,7}, 
# {24,11,6,1,13}, 
# {16,2,17,19,8}, 
# {23,18,22,9,10} 
# 
# の横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替え(上が小さくな 
るように) 
# 結果を出力 
# 
# 結果は 
# 
# 5 21 4 14 12 
# 25 20 15 3 7 
# 24 11 6 1 13 
# 16 2 17 19 8 
# 23 18 22 9 10 
# 
# のような形で出力 


'横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替えて出力する'(_ファイル) :- 
        行列に入力する(_ファイル,_行列1),
        '横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替えてW得点データをバブルソートを用いて国語の得点の大きい順に並び替えよ出力する'(_行列1,_行列2),
        出力する(_行列2),!.

'横の各行を小さい順に並び替えた後、縦の各列を小さい順に並び替えて出力する'(_行列1,_行列2) :- 
        各行を整列する(_行列1,_行列3), 
        縦の各列を整列する(_行列3,_行列2).

行列に入力する(_ファイル,_行列) :-
        get_split_lines(_ファイル,['{',',','}'],_行列).

各行を整列する([],[]) :- !. 
各行を整列する([_行|R1],[_整列された行|R2]) :- 
        quicksort(_行,_整列された行), 
        各行を整列する(R1,R2). 

縦の各列を整列する(_行列1,_行列2) :- 
        転置(_行列2,_行列3), 
        各行を整列する(_行列3,_行列4), 
        転置(_行列4,_行列2).

出力する(_行列2) :-
        append(L0,[L|R],_行列2), 
        concat_atom(L,' ',S), 
        writef('%t\n',[S]), 
        R = [].

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

get_split_lines(File,Sep,Lines) :-
        get_lines(File,Lines1),
        findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines) .

get_lines(File,Lines) :-
        get_chars(File,L),
        chars_lines(L,Lines),!.

get_lines(Lines) :-
        findall(Line,(
                    repeat ,
                    get_line(Line) ,
                    (Line = end_of_file , (!) , fail ; true)),
                Lines).

get_chars(File,L) :-
        \+(is_stream(_,File,_)),
        exists(File,read),
        open(File,read,Input),
        get_char(Input,X),
        get_chars(Input,X,L),
        close(Input),!.
get_chars(Input,L) :-
        is_stream(_,Input,_),
        get_char(Input,X),
        get_chars(Input,X,L),!.

get_line(Instream,X) :-
        get_char(Instream,C),
        get_line_3(Instream,C,Chars),
        atom_chars(X,Chars),!.

get_line(X) :-
        get_char(C),
        get_line_1(C,Chars),
        atom_chars(X,Chars).

get_line_1('\n',[]) :- !.
get_line_1(end_of_file,[]) :- !.
get_line_1(C,[C|R]) :-
        get_char(C2),
        get_line_1(C2,R).

get_line_3(_,'連続','\n',[]) :- !.
get_line_3(Instream,_診断,'\r',X) :-
        get_char(Instream,C2),
        get_line_3_2(Instream,_診断,C2,X),!.
get_line_3(Instream,'終了',end_of_file,[]) :- !.
get_line_3(Instream,_診断,C,[C|R]) :-
        get_char(Instream,C2),
        get_line_3(Instream,_診断,C2,R).

get_line_3(_,'\n',[]) :- !.
get_line_3(Instream,end_of_file,[]) :- !.
get_line_3(Instream,C,[C|R]) :-
        get_char(Instream,C2),
        get_line_3(Instream,C2,R).

get_chars(L) :-
        findall(U,(
                    repeat ,
                    get_char(U) ,
                    (U = end_of_file , (!) , fail ; true)),
                L).


get_line(Instream,_診断,X) :-
        get_char(Instream,C),
        get_line_3(Instream,_診断,C,Chars),
        atom_chars(X,Chars),!.

get_line(Instream,X) :-
        get_char(Instream,C),
        get_line_3(Instream,C,Chars),
        atom_chars(X,Chars),!.

get_line(X) :-
        get_char(C),
        get_line_1(C,Chars),
        atom_chars(X,Chars).

get_line_1('\n',[]) :- !.
get_line_1(end_of_file,[]) :- !.
get_line_1(C,[C|R]) :-
        get_char(C2),
        get_line_1(C2,R).

get_line_3(_,'連続','\n',[]) :- !.
get_line_3(Instream,_診断,'\r',X) :-
        get_char(Instream,C2),
        get_line_3_2(Instream,_診断,C2,X),!.
get_line_3(Instream,'終了',end_of_file,[]) :- !.
get_line_3(Instream,_診断,C,[C|R]) :-
        get_char(Instream,C2),
        get_line_3(Instream,_診断,C2,R).

get_line_3(_,'\n',[]) :- !.
get_line_3(Instream,end_of_file,[]) :- !.
get_line_3(Instream,C,[C|R]) :-
        get_char(Instream,C2),
        get_line_3(Instream,C2,R).

get_line_3_2(Instream,'連続','\n',[]) :- !.
get_line_3_2(Instream,'連続',C,['\r'|R]) :-
        \+(C == '\n'),
        get_line_3(Instream,_診断,C,R),!.

split(_文字列,_区切り符号ならび,X) :-
        sPlit(_文字列,_区切り符号ならび,Y),
        findall(U,(member(U,Y) , not U = ''),L),
        L = X,!.

sPlit(_文字列,_区切り符号ならび,X) :-
        atom_chars(_文字列,L),
        split_00(L,_区切り符号ならび,Y),
        findall(U,(member(U,Y) , \+(member(U,_区切り符号ならび))),Z),
        Z = X,!.

split_00(_文字ならび,_区切り符号ならび,X) :-
        findall([B,A],(
                    member(A,_区切り符号ならび) ,
                    atom_chars(A,B)),
                _区切り符号ならびの二),
        split_0(_文字ならび,_区切り符号ならびの二,X).

split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :-
        member([_区切り文字ならび,_区切り符号],_区切り符号ならび),
        _文字ならび = _区切り文字ならび,!.
split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :-
        member([_区切り文字ならび,_区切り符号],_区切り符号ならび),
        append(_区切り文字ならび,R,_文字ならび),
        split_1(R,_区切り符号ならび,R2),!.
split_0(L,_区切り符号ならび,X) :-
        split_1(L,_区切り符号ならび,X).

split_1([],_,[]) :- !.
split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :-
        member([_区切り文字ならび,_区切り符号],_区切り符号ならび),
        _文字ならび = _区切り文字ならび,!.
split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :-
        member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび),
        append(_区切り文字ならび,R,_文字ならび),
        split_2(R,R2,_区切り符号_2,_区切り符号ならび,B),
        split_5(B,C),
        split_0(R2,_区切り符号ならび,X),!.
split_1(_文字ならび,_区切り符号ならび,[C|X]) :-
        split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B),
        _区切り符号 = '',
        split_5(B,C),
        split_0(R2,_区切り符号ならび,X),!.
split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :-
        split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B),
        \+(_区切り符号 = ''),
        split_5(B,C),
        split_0(R2,_区切り符号ならび,X),!.

split_2([],[],'',_,[]) :-!.
split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :-
        member([_区切り文字ならび,_区切り符号],_区切り符号ならび),
        append(_区切り文字ならび,R,_文字ならび),!.
split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :-
        split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!.
split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :-
        split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!.
split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :-
        split_2(R,R2,_区切り符号,_区切り符号ならび,X),!.

split_5([],'') :- !.
split_5(B,C) :-
        numeric_list(B,Nl),
        number(C,Nl),!.
split_5(B,C) :-
        concat_atom(B,C),!.

split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :-
        split_42(R,R2,_区切り符号,_区切り符号ならび,X),!.
split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :-
        split_42(R,R2,_区切り符号,_区切り符号ならび,X),!.

split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :-
        split_42(R,R2,_区切り符号,_区切り符号ならび,X),!.
split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :-
        split_2(R,R2,_区切り符号,_区切り符号ならび,X),!.
split_42([],[],'',_,[]) :- !.

split_42([_文字|R],R2,_区切り符号ならび,[_文字|X]) :-
        split_42(R,R2,_区切り符号,_区切り符号ならび,X),!.
number(A,B) :-
        number_codes(A,B).

numeric_list([],[]) :-!.
numeric_list([A|R],[B|R1]) :-
        digit(A),
        char_code(A,B),
        numeric_list(R,R1),!.
numeric_list(['.'|R],[46|R1]) :-
        numeric_list(R,R1),!.
numeric_list([-|R],[45|R1]) :-
        numeric_list(R,R1),!.

転置([[]|_],[]) :- !.
転置(L,[L1|R2]) :-
        転置(L,L2,L1),
        転置(L2,R2).

転置([],[],[]) :- !.
転置([[A|R1]|R2],[R1|R3],[A|R4]) :-
        転置(R2,R3,R4).

% *** user: quicksort / 2 ***
quicksort([X|Xs],Ys) :-
        partition(Xs,X,Littles,Bigs),
        quicksort(Littles,Ls),
        quicksort(Bigs,Bs),
        append(Ls,[X|Bs],Ys).
quicksort([],[]).

partition([X|Xs],Y,[X|Ls],Bs) :-
        X @=< Y,
        partition(Xs,Y,Ls,Bs).
partition([X|Xs],Y,Ls,[X|Bs]) :-
        X @> Y,
        partition(Xs,Y,Ls,Bs).
partition([],Y,[],[]).