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

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

tenpai([], _, []).
tenpai([N|Ns], Cs0, [N|Ms]) :-
	inc(N, Cs0, Cs),
	agari0(Cs),
	!,
	tenpai(Ns, Cs0, Ms).
tenpai([_|Ns], Cs0, Ms) :-
	tenpai(Ns, Cs0, Ms).

inc(1, [C|Cs], [s(C)|Cs]).
inc(N, [C|Cs0], [C|Cs]) :-
	N > 1,
	N1 is N - 1,
	inc(N1, Cs0, Cs).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% 清一色の和りチェック
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
agari(Ns) :-
	length(Ns, 14),
	count(Ns, Cs),
	agari0(Cs).

%%
%% 1〜9の各数について出現回数を数える
%% 出現回数は 0, s(0), s(s(0)), … で表現
%%
%% 例えば count([3,7,4,1,9,8,6,1,9,3,1,9,5,1], Cs) の場合
%% Cs = [s(s(s(s(0)))),0,s(s(0)),s(0),s(0),s(0),s(0),s(0),s(s(s(0)))]
%%
count(Ns, Cs) :-
	count([1,2,3,4,5,6,7,8,9], Ns, _, Cs).

count([], Ns, Ns, []).
count([M|Ms], Ns0, Ns, [C|Cs]) :-
	count0(M, Ns0, Ns1, C),
	count(Ms, Ns1, Ns, Cs).

count0(M, [M|Ns0], Ns, s(C)) :-
	count0(M, Ns0, Ns, C).
count0(M, [N|Ns0], [N|Ns], C) :-
	M \== N,
	count0(M, Ns0, Ns, C).
count0(_, [], [], 0).

%%
%% 和りチェック
%%
agari0([0|Cs]) :-			% 0枚はとばす
	agari0(Cs).
agari0([s(C1),s(C2),s(C3)|Cs]) :-	% シュンツ
	agari0([C1,C2,C3|Cs]).
agari0([s(s(s(C)))|Cs]) :-		% コーツ
	agari0([C|Cs]).
agari0([s(s(C))|Cs]) :-			% トイツ
	agari1([C|Cs]).

%%
%% 和りチェック (トイツを取り除いた後)
%%
agari1([]).				% 和り
agari1([0|Cs]) :-			% 0枚はとばす
	agari1(Cs).
agari1([s(C1),s(C2),s(C3)|Cs]) :-	% シュンツ
	agari1([C1,C2,C3|Cs]).
agari1([s(s(s(C)))|Cs]) :-		% コーツ
	agari1([C|Cs]).


