このディレクトリの索引

#  問3
#  正整数n,n個の長さ20以下の文字列,および文字列sを読み込み,
#  文字列sがselectionのときは選択ソート,文字列がbubbleのときは
#  バブルソートをして,文字列型配列を辞書順に出力するプログラムを作成せよ.
#  文字列を入れ替えるのに,以下の関数swap()を用いてもよい.
#  
#  実行例
#  整数 > 3
#  0番目の文字列 > b
#  1番目の文字列 > c
#  2番目の文字列 > a
#  文字列 > bubble
#  a
#  b
#  c
#  
#  
#  実行例
#  整数 > 7
#  0番目の文字列 > Blake
#  1番目の文字列 > Leighton
#  2番目の文字列 > Taylor
#  3番目の文字列 > Jessica
#  4番目の文字列 > Penn
#  5番目の文字列 > Chace
#  6番目の文字列 > Ed
#  文字列 > selection
#  Blake
#  Chace
#  Ed
#  Jessica
#  Leighton
#  Penn
#  Taylor
#  

'正整数n,n個の長さ20以下の文字列,および文字列sを読み込み,文字列sがselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして,文字列型配列を辞書順に出力する' :-
        '正整数nの読み込み'(_正の整数n),
        'n個の長さ20以下の文字列の読み込み'(_正の整数n,_n個の長さ20以下の文字列ならび),
        'および文字列sを読み込み'(_文字列s),
        '文字列sがselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして,文字列型配列を辞書順に出力する'(_文字列s,_n個の長さ20以下の文字列ならび).

'正整数nの読み込み'(_正の整数n) :-
        write('正の整数を入力してください : '),
        get_integer(_正の整数n),
        _正の整数n > 0,!.

'n個の長さ20以下の文字列の読み込み'(_正の整数n,_n個の長さ20以下の文字列ならび) :-
        length(_n個の長さ20以下の文字列ならび,_正の整数n),
        findall(_文字列,(
                    append(L0,[_|_],_n個の長さ20以下の文字列ならび),
                    get_line(_文字列)),
                _n個の長さ20以下の文字列ならび).

'文字列sがselectionのときは選択ソート,文字列がbubbleのときはバブルソートをして,文字列型配列を辞書順に出力する'(selection,_n個の長さ20以下の文字列ならび) :-

        選択ソート(_n個の長さ20以下の文字列ならび,_辞書順に整列されたn個の長さ20以下の文字列ならび),
        出力する(_辞書順に整列されたn個の長さ20以下の文字列ならび).

出力する(_辞書順に整列されたn個の長さ20以下の文字列ならび) :-
        append(_,[_文字列|R],_辞書順に整列されたn個の長さ20以下の文字列ならび),
        writef('%t\n',[_文字列]),
        R = [].

辞書順選択ソート([A],[A]) :- !.
辞書順選択ソート(L1,[_文字列|R2]) :-
        append(L0,[_文字列|R],L1),
        \+((member(文字列1,L0),辞書コード比較(_文字列,_文字列1))),
        \+((member(文字列2,R),辞書コード比較(_文字列,_文字列2))),
        swap(L0,[_文字列|R],R1),
        辞書順選択ソート(R1,R2).

swap([],[N|R],R) :- !.
swap(L0,[N|R],R1) :-
        L0=[S|R0],
        append(R0,[S|R],R1).

辞書順バブルソート(_対象ならび,_整列済みならび) :-
        辞書順交換(_対象ならび,_対象ならびの一),!,
        辞書順バブルソート(_対象ならびの一,_整列済みならび).
辞書順バブルソート(_整列済みならび,_整列済みならび).

辞書順交換([],[]) :- !,fail.
辞書順交換([A,B|R],[B,A|R]) :-
        辞書コード比較(A,B),!.
辞書順交換([A|R1],[A|R2]) :-
        辞書順交換(R1,R2).


辞書コード比較(_文字列1,_文字列2) :-
        atom_to_codes(_文字列1,Codes1),
        辞書順用にコード列を変換する(Codes1,_変換されたCodes1),
        atom_to_codes(_文字列2,Codes2),
        辞書順用にコード列を変換する(Codes2,_変換されたCodes2),
        _変換されたCoode1 @> _変換されたCodes2,!.

辞書順用にコード列を変換する([],[]) :- !.
辞書順用にコード列を変換する([A|R1],[B|R2]) :-
        A >= 32,
        A =< 90,
        B is (A + 32) * 10,
        辞書順用にコード列を変換する(R1,R2),!.
辞書順用にコード列を変換する([A|R1],[B|R2]) :-
        B is A * 10 + 1,
        辞書順用にコード列を変換する(R1,R2),!.
辞書順用にコード列を変換する([A|R1],[B|R2]) :-
        B is A * 10,
        辞書順用にコード列を変換する(R1,R2),!.