このディレクトリの索引

#  出題場所 :: 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個をとりのぞいたのこりの数) :-
        _シャッフルした1からnのn個の連続した整数=[_,_|_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).