このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1342966104/667
#  [1] 授業単元:C言語  
#  [2] 問題文: http://ime.nu/ideone.com/tRkzM 
#  
#  1. 10000から99999のランダムな自然数を1000コ生成し、小さい順にこれら数値を表示するプログラムを作成せよ。
#    ただし数値は何番目に生成した数値かも表示する。
#   
#    例)1番目に小さい数は475番目の数10049です。
#   
#  2. 10000から999999のランダムな自然数を1000コ生成し、各数値と平均値との差をもとめ、その差が小さい順にその数値を   表示するプログラムを作成せよ。また、各数値は何番目に生成したかも表示する。
#   
#    例)1番目に平均との差が小さい数は680番目の数69383です。 平均値との差は10.505です。
#   
#  3. n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。
#    ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15 は仮定する。
#   
#    例)program 5
#        a,b,c,d,e
#        a,b,c,e,d
#        a,b,d,c,e
#            ・
#        ・
#      e,d,c,b,a

'n種類の文字{a1,a2,・・・,an}を考える。このn種類の文字を使って構成できるn文字列をすべて表示せよ。ただし文字の重複はなし。nはプログラムの引数としてあたえ、1 < n < 15 は仮定する。'(_n) :-
        length(L,_n),
        重複しないn文字を得る(_n,L),
        このn種類の文字を使って構成できるn文字列をすべて表示せよ(_n,L).

重複しないn文字を得る(0,L,L) :- !.
重複しないn文字を得る(N,L1,L) :-
        'L1に重複しない一文字を追加する'(L1,L2),
        N_1 is N - 1,
        重複しないn文字を得る(N_1,L2,L),!.
重複しないn文字を得る(N,L1,L) :-
        重複しないn文字を得る(N,L1,L).

'L1に重複しない一文字を追加する'(L1,L2) :-
        write('一文字入力してください : '),
        get_char(_文字),
        \+(member(_文字,L1)),
        append(L1,[_文字],L2).

このn種類の文字を使って構成できるn文字列をすべて表示せよ(_n,L) :-
        このn種類の文字を使って構成できるn文字列を(_n,L,_文字列ならび),
        append(_,[_文字列|R],_文字列ならび),
        writef('%t\n',[_文字列]),
        R = [].

このn種類の文字を使って構成できるn文字列を(_n,L,_文字列ならび) :-
        findall(_文字列,(
                    順列(L,_n,L1),
                    atomic_list_concat(L1,',',_文字列)),
                _文字列ならび).

順列(Y,0,[]).
順列(Y,N,[A|X]) :-
        del(A,Y,Z),
        M is N - 1,
        順列(Z,M,X).

del(A,[A|X],X).
del(A,[B|X],[B|Y]) :-
        del(A,X,Y).