これはティチュの有効な遊びですか?


11

Tichuは、標準の52カードデッキと4枚の追加カードで構成されるデッキからカードを順番にプレイするカードゲームです。

  • ドラゴン他のカードよりも大きな値を持ち、
  • ワイルドカードとして機能するフェニックス
  • あなたのパートナーにターンを渡し、
  • 値が1 のMah Jong(および保持している人が最初に再生します)

最初のプレーヤー(「リード」があると言われている)は、次のタイプのカードの組み合わせのいずれかをプレイすることを選択できます。

  • シングル(例えば6
  • JJ
  • トリプル555
  • フルハウスQQQ33) -トリプルとペア
  • ストレート56789) - 5以上の連続したカード
  • トラクタ223344) -ペアの任意の連続配列

その後のプレーヤーは、同じタイプのカードのセットをプレイすることのみが許可されますが、厳密にそれよりも高くなります。たとえば、のQQ上で再生できますJJが、QQKKできません(ペアではなくトラクターです)。フルハウスはトリプル(例えば77722> 44499)で注文され、ストレートとトラクターは同じ長さでなければなり456789ません(の上でプレイすることはできません23456)。エースは高いです。

例外が1つあります。同じカードの4つは爆弾であり、上位の爆弾以外のものの上でプレイできます。1

ドラゴンは単独で、またはリードを使って(または他の場所では)プレイできます。フェニックスは、ワイルドカードであるだけでなく、ドラゴン以外のシングルの上でプレイすることもできます。2犬はリードがなければ単独でプレイでき、すぐにターンを終了します。


あなたの課題は、前のプレーを考慮して、特定のティチュプレーが有効かどうかを判断することです。

両方のプレイを任意の順序で整数または文字列のリストとして受け入れることができます。どちらの場合も、整数/文字へのカードのマッピングを選択できます。前のプレーがあった場合、それは常に有効であり、そうでない場合(つまり、プレーヤーがリードしている場合)、最初の入力は空の配列/文字列(他の入力のタイプと一致)になります。カードが特定の順序で提供されることは保証されていません。

出力は、厳密に2つの異なる値のセットから選択する必要があります。1つはプレイが合法であることを示し、もう1つは合法ではないことを示します。

カードのセットがデッキに実際に存在するかどうかをテストする必要はありません(たとえば、7が4つしかないため、77766その後に続くこと88877は不可能です)。そのようなケースは決して与えられません。

次のテストケースで234567890JQKAは、2からaceをRPD1表し、それぞれドラゴン、フェニックス、犬、麻雀を表します。空の文字列は、ここではとして示されてい-ます。これらの劇は合法です:

6 J
JJ QQ
555 KKK
44499 77722
23456 56789
223344 QQKKAA
49494 72727
A R
A P
P R
66 7P
P6 77
58304967 6P0594J7
5P304967 680594J7
57446765 788657P5
- D
- 1
- 12345
3344556677889900 JJJJ
5555 7777

そして、これらはそうではありません:

9 3
66 55
888 444
44 888
77722 44499
44499 777
44499 777JJJ
45678 34567
34567 456789
556677 334455
5566 778899
72727 49494
A A
R A
R P
77 RP
77 6P
P7 66
680594J7 5P304967
6P0594J7 58304967
57446765 3645P536
1 D
2 D
2 1
- 1234
7777 5555
- 223355

1:実際には、ストレートフラッシュも爆弾ですが、これはゲーム内でカードの組み合わせが問題になる唯一の場所であるため、簡単にするために省略しました。

2:値nのカードの上でプレイされるフェニックスの値は、実際にはn + 0.5です(9のフェニックスは9と半分です)。これは、判断するために追加の履歴の知識を必要とするため、単一のフェニックスに加えてプレイされる単一のテストケースは含まれません

3:最初の入力が犬になることはありません


すべての有効な組み合わせはない@Arnauld(例えば777JJJ1234223355)。ただし、RP有効ではありません:「ドラゴンは単独で、またはリードを使用して単独でプレイできます(他の場所ではプレイできません)。
ドアノブ

実際、私はコメントを編集して、すべてのファーストハンドが常に有効であるように見せようとしていました。
アーノールド

1
@アーナウルドああ-はい、あなたはすべての最初の手が有効であると思うかもしれません。
ドアノブ

フェニックスを爆弾のワイルドカードとして使用することはできません。5555 777P無効なプレイである必要がありますが、現在の両方の回答で有効とマークされています。
Jitse

回答:


5

JavaScriptの(ES6)、 274の  273バイト

(a)(b)ab

  • 1
  • 4..16
  • 18
  • 19

有効な場合はfalse、無効な場合はtrueを返します。

a=>b=>!(L='length',[A,B]=(g=a=>(h=n=>--n?[i=1,2,3,'(20*)3|30*2','1{5,}','22+',4].some(p=>m=o.join``.match(`9(0*)(${p})0*$`,i++),a.map(x=>o[x-19?x:x=n]=-~o[x],o=[...9e16+'']))?[i,m[1][L]+(m[3]||[])[L]]:h(n):[])(18))(a),[C,D]=g(b),a+a?A-C?C>7|+b>a:a[L]==b[L]&D>B|A<3&b==18:C)

オンラインでお試しください!

どうやって?

o[]9

//       D  -  1  2  3  4  5  6  7  8  9  T  J  Q  K  A
o = [ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];

手札のカードランクごとに、対応するスロットo[]が増加します。文字列に結合し直したら、次の正規表現を適用して、手の種類を検出できます。

 hand        | pattern     | full regex              | example
-------------+-------------+-------------------------+-------------------
 single      | 1           | /9(0*)(1)0*$/           | 90000100000000000
 pair        | 2           | /9(0*)(2)0*$/           | 90000002000000000
 3-of-a-kind | 3           | /9(0*)(3)0*$/           | 90003000000000000
 full house  | (20*)3|30*2 | /9(0*)((20*)3|30*2)0*$/ | 90020000030000000
 straight 5+ | 1{5,}       | /9(0*)(1{5,})0*$/       | 90000111110000000
 tractor     | 22+         | /9(0*)(22+)0*$/         | 90000000000022200
 bomb        | 4           | /9(0*)(4)0*$/           | 90000000000000004

手がこれらの正規表現のいずれもトリガーしない場合、それは無効です。

9(20*)

フェニックス(つまり、ワイルドカード)は、一致が検出されるまで、最も高いランクから順に、可能な各カードランクに置き換えられます。


0

Pythonの3466の 455 403 401 399バイト

R=lambda H,n=3:n==len(H)*(len({*H})<2)and[15]!=H[1:]
s=lambda H:[H[2:],H[:1]][R(H[:3])]
def n(J,K):j,k=[[16in H,R(H,4),len(H)>4and all(15!=t>T-2for t,T in zip(H,H[1:])),[R(H[2:])*R(H[:2],2),R(H[3:],2)][R(H[:3])],R(H),R(H,2),R(H,1),1].index(1)for H in[J,K]];return k!=7and[17]==J or[j==k*[J<K,s(J)<s(K)][2<j<5],J<K][k==1]
f=lambda P:any(n(*[sorted([L,i][i>0]for i in H)for H in P])for L in range(16))

オンラインでお試しください! 入力は手のリストです。ここで、手は整数1のリストであり、次の値がマッピングされています。

  • 0:フェニックス
  • 1:麻雀
  • 2-13:2対エース
  • 14:ドラゴン
  • 15:犬
  • 16:空の文字列

1:リンクされたTIOでは、テストは文字列のリストで表現されますが、呼び出し前に値のマッピングに従って翻訳されます。 f

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.