このディレクトリの索引

# 出典 :: データ構造とアルゴリズム総合 #40 # まず雀頭1と順子4つになっているか確認 # その後19字牌がないがチェック ない場合成立 # 二杯口は順子をグループ化してふたつどういつかチェックすればいいんでね # 平和だけどタンヤオって時点で役牌じゃない&二杯口も前提条件だから # 両方が成立したとき自動的に成立 # # タンピンリャンペーコーを判定する専用ならこういうやり方でいいんでね # タンピンリャンペーコー(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P) :- 整列([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P]),L1), タンピンリャンペーコー生成(L2), 整列(L2,L1). タンピンリャンペーコー生成([A,B,C,A,B,C,D,E,F,D,E,F,G,G]) :- '一・九を除く順子'(萬子,A,B,C), '一・九を除く順子'(筒子,D,E,F), 積集合([A,B,C],[D,E,F],[]). 雀頭(_子,G,G), \+(member(G,[A,B,C,D,E,F])). タンピンリャンペーコー生成([A,B,C,A,B,C,D,E,F,D,E,F,G,G]) :- '一・九を除く順子'(索子,A,B,C), '一・九を除く順子'(筒子,D,E,F), 積集合([A,B,C],[D,E,F],[]). 雀頭(_子,G,G), \+(member(G,[A,B,C,D,E,F])). タンピンリャンペーコー生成([A,B,C,A,B,C,D,E,F,D,E,F,G,G]) :- '一・九を除く順子'(萬子,A,B,C), '一・九を除く順子'(索子,D,E,F), 積集合([A,B,C],[D,E,F],[]). 雀頭(_子,G,G), \+(member(G,[A,B,C,D,E,F])). 雀頭(萬子,A,A) :- '一・九を除く字牌'(萬子,_萬子ならび), append(_,[A|_],_筒子ならび). 雀頭(索子,A,A) :- '一・九を除く字牌'(萬子,_索子ならび), append(_,[A|_],_索子ならび). 雀頭(筒子,A,A) :- '一・九を除く字牌'(筒子,_筒子ならび), append(_,[A|_],_筒子ならび). '一・九を除く順子'(萬子,A,B,C) :- '一・九を除く字牌'(萬子,_萬子ならび), append(_,[A,B,C|_],_筒子ならび). '一・九を除く順子'(索子,A,B,C) :- '一・九を除く字牌'(索子,_索子ならび), append(_,[A,B,C|_],_索子ならび). '一・九を除く順子'(筒子,A,B,C) :- '一・九を除く字牌'(筒子,_筒子ならび), append(_,[A,B,C|_],_筒子ならび). '一・九を除く字牌'(萬子,[二萬,三萬,四萬,五萬,六萬,七萬,八萬]). '一・九を除く字牌'(筒子,[二筒,三筒,四筒,五筒,六筒,七筒,八筒]). '一・九を除く字牌'(索子,[二索,三索,四索,五索,六索,七索,八索]). 整列([],[]). 整列([A|R],L) :- 分割(A,R,L1,L2), 整列(L1,L11), 整列(L2,L22), append(L11,[A|L22],L). 分割(A,[],[],[]). 分割(A,[B|R1],[B|R2],R3) :- A @>= B, 分割(A,R1,R2,R3). 分割(A,[B|R1],R2,[B|R3]) :- A @< B, 分割(A,R1,R2,R3). 積集合([],_,[]) :- !. 積集合([X|_集合1],_集合2,[X|_積集合]) :- member(X,_集合2), 積集合(_集合1,_集合2,_積集合),!. 積集合([X|_集合1],_集合2,_積集合) :- \+(member(X,_集合2)),!, 積集合(_集合1,_集合2,_積集合).