このディレクトリの索引

#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/282
#  お題:1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 
#  のこりの数からとりのぞいた2個の数を求める。 
#  例 
#  3,1,2,6  ->  4,5 
# 
# 

'1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。
のこりの数からとりのぞいた2個の数を求める。'(_n,_とりのぞいた数_1,_とりのぞいた数_2) :-
        '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数),
        'のこりの数からとりのぞいた2個の数を求める。'(1,_2個をとりのぞいたのこりの数,[],[_とりのぞいた数_1,_とりのぞいた数_2]).

'1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数) :-
        '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数),
        シャッフルして(_n,_1からnのn個の連続した整数,_シャッフルした1からnのn個の連続した整数),
        '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数).

'1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数) :-
        findall(M,between(1,_n,M),_1からnのn個の連続した整数).

シャッフルして(_n,L1,L2) :-
        シャッフルして(1000,_n,L1,L2),!.

シャッフルして(0,_,L,L).
シャッフルして(M,_n,L1,L) :-
        R is random(_n) + 1,
        select(R,L1,L2),
        M_1 is M - 1,
        シャッフルして(M_1,_n,[R|L2],L).

'適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :-
        適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[],[_数_1,_数_2]),
        'とりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数).

適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[A,B],[A,B]) :- !.
適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,L1,L) :-
        適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数),
        適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[_適当に選んだ数|L1],L).

適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数) :-
        length(_シャッフルした1からnのn個の連続した整数,Len),
        R1 is random(Len),
        nth0(R1,_シャッフルした1からnのn個の連続した整数,_適当に選んだ数),
        \+(member(_適当に選んだ数,L1)),!.
適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数) :-
        適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数).

        
'とりのぞく。'(_数_1,_数_2,_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :-
        select(_数_1,_シャッフルした1からnのn個の連続した整数,L1),
        select(_数_2,L1,_2個をとりのぞいたのこりの数).

'のこりの数からとりのぞいた2個の数を求める。'(_,_,L,L) :-
        length(L,2),!.
'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :-
        select(_n,L1,L1_2),!,
        _n_2 is _n  + 1,
        'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1_2,L2,L).
'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :-
        _n_2 is _n  + 1,
        'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1,[_n|L2],L).