%%%
%%% 清一色
%%% by Naoyuki Tamura (tamura@kobe-u.ac.jp)
%%%

%%%
%%% 清一色の待ちを返す
%%%
tenpai(Ns, Ms) :-
	machi([1,2,3,4,5,6,7,8,9], Ns, Ms).

machi([], _, []).
machi([I|Is], Ns, [I|Ms]) :-
	agari([I|Ns]),
	!,
	machi(Is, Ns, Ms).
machi([_|Is], Ns, Ms) :-
	machi(Is, Ns, Ms).

%%%
%%% 清一色の和り判定
%%%
agari(Ns0) :-
	qsort(Ns0, Ns1),
	toitsu(Ns1, Ns2),
	mentsu(Ns2, Ns3),
	mentsu(Ns3, Ns4),
	mentsu(Ns4, Ns5),
	mentsu(Ns5, []),
	!.

%%
%% リストのどこかからトイツを取り除く
%%
toitsu(Ns0, Ns) :-
	del(N, Ns0, Ns1),
	del_once(N, Ns1, Ns).

%%
%% リストの先頭からコーツまたはシュンツを取り除く
%%
mentsu(Ns0, Ns) :-
	kotsu(Ns0, Ns).
mentsu(Ns0, Ns) :-
	shuntsu(Ns0, Ns).

kotsu([N|Ns0], Ns) :-
	del_once(N, Ns0, Ns1),
	del_once(N, Ns1, Ns).

shuntsu([N|Ns0], Ns) :-
	N1 is N+1,
	del_once(N1, Ns0, Ns1),
	N2 is N+2,
	del_once(N2, Ns1, Ns).

del(N, [N|Ns], Ns).
del(N, [N0|Ns0], [N0|Ns]) :-
	del(N, Ns0, Ns).

del_once(N, [N|Ns], Ns) :- !.
del_once(N, [N0|Ns0], [N0|Ns]) :-
	del_once(N, Ns0, Ns).

qsort([], []).
qsort([X|L], S) :-
        partition(L, X, L1, L2),
        qsort(L1, S1),
        qsort(L2, S2),
        append(S1, [X|S2], S).

partition([], _, [], []).
partition([Y|L], X, [Y|L1], L2) :-
        Y < X,
        partition(L, X, L1, L2).
partition([Y|L], X, L1, [Y|L2]) :-
        Y >= X,
        partition(L, X, L1, L2).

append([], Zs, Zs).
append([X|Xs], Ys, [X|Zs]) :-
	append(Xs, Ys, Zs).
