Ist das ein gültiges Tichu-Spiel?

11

Tichu ist ein Kartenspiel, bei dem die Spieler abwechselnd Kartensätze aus einem Stapel spielen, der aus einem Standardstapel mit 52 Karten plus 4 zusätzlichen Karten besteht:

  • der Drache , der einen größeren Wert hat als jede andere Karte
  • der Phönix , der als Platzhalter fungieren kann
  • der Hund , der die Wende an Ihren Partner weitergibt
  • der Mah Jong , der den Wert 1 hat (und die Person, die ihn hält, spielt zuerst)

Der erste Spieler (der "Lead" haben soll) kann eine der folgenden Arten von Kartenkombinationen spielen:

  • eine einzelne (z6 )
  • ein Paar (JJ )
  • ein dreifaches (555 )
  • ein volles Haus ( QQQ33) - ein Triple und ein Paar
  • eine gerade ( 56789) - 5 oder mehr aufeinanderfolgende Karten
  • ein Traktor ( 223344) - jede aufeinanderfolgende Folge von Paaren

Nachfolgende Spieler dürfen dann nur einen Kartensatz des gleichen Typs spielen, jedoch streng höher. QQKann zum Beispiel über JJ, aber QQKKnicht gespielt werden (es ist ein Traktor, kein Paar). Volle Häuser werden nach dem Triple bestellt (zB 77722> 44499), und Geraden und Traktoren müssen gleich lang sein ( 456789können nicht darüber gespielt werden 23456). Asse sind hoch.

Es gibt eine Ausnahme: Jede 4 derselben Karte ist eine Bombe und kann über alles außer einer höheren Bombe gespielt werden. 1

Der Drache kann alleine auf einem einzelnen oder mit Blei gespielt werden (aber nirgendwo anders). Der Phönix kann nicht nur eine Wildcard sein, sondern auch auf jedem einzelnen außer dem Drachen gespielt werden. 2 Der Hund kann nur alleine mit Blei gespielt werden und beendet sofort den Zug. 3


Ihre Herausforderung besteht darin, festzustellen, ob ein bestimmtes Tichu-Spiel angesichts des vorherigen Spiels gültig ist.

Sie können beide Spiele in beliebiger Reihenfolge als Listen von Ganzzahlen oder Zeichenfolgen akzeptieren. In beiden Fällen können Sie eine beliebige Zuordnung von Karten zu Ganzzahlen / Zeichen auswählen. Wenn es ein vorheriges Spiel gab, ist es immer gültig, und wenn nicht (dh der Spieler hat Lead), ist die erste Eingabe das leere Array / die leere Zeichenfolge (passend zum Typ der anderen Eingabe). Es wird nicht garantiert, dass die Karten in einer bestimmten Reihenfolge ausgegeben werden.

Ihre Ausgabe muss aus einer Reihe von genau zwei unterschiedlichen Werten ausgewählt werden, von denen einer angibt, dass das Spiel legal ist, und einer angibt, dass dies nicht der Fall ist.

Es besteht keine Notwendigkeit zu testen, ob der Kartensatz tatsächlich im Deck vorhanden ist (z. B. 77766gefolgt von 88877ist unmöglich, da es nur vier Siebenen gibt) - solche Fälle werden niemals gegeben.

Stellen Sie in den folgenden Testfällen 234567890JQKA2 bis Ass dar und RPD1stellen Sie den Drachen, den Phönix, den Hund bzw. Mah Jong dar. Die leere Zeichenfolge wird hier als angezeigt -. Diese Spiele sind legal:

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

Und das sind nicht:

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: Eigentlich ist ein Straight Flush auch eine Bombe, aber da dies der einzige Ort im Spiel ist, an dem die Farbe der Karten eine Rolle spielt, habe ich mich der Einfachheit halber dafür entschieden, ihn wegzulassen

2: Der Wert des Phönix, der auf einer Karte mit dem Wert n gespielt wird, ist tatsächlich n + 0,5 (ein Phönix auf einer 9 ist eine 9 und eine halbe); Da dies die Kenntnis der zusätzlichen Vorgeschichte erfordert, um zu entscheiden, handelt es sich bei keinem Testfall um eine einzelne, die auf einem einzelnen Phönix gespielt wird

3: Die erste Eingabe wird also niemals Hund sein

Türknauf
quelle
@Arnauld Nicht alle gültigen Kombinationen (zB sind 777JJJ, 1234, 223355). Ist RPjedoch nicht gültig: " Der Drache kann alleine auf einem einzelnen oder mit Blei gespielt werden (aber nirgendwo anders). "
Türknauf
In der Tat wollte ich gerade meinen Kommentar bearbeiten, um zu sagen, dass alle ersten Hände immer gültig zu sein scheinen.
Arnauld
1
@Arnauld Ah - ja, Sie können davon ausgehen, dass alle ersten Hände gültig sind.
Türknauf
Es kann erwähnenswert sein, dass ein Phenix nicht als Platzhalter in einer Bombe verwendet werden darf. 5555 777Psollte ein ungültiges Spiel sein, aber beide aktuellen Antworten markieren es als gültig.
Jitse

Antworten:

5

JavaScript (ES6),  274  273 Byte

(a)(b)ab

  • 1
  • 3
  • 4..16
  • 18
  • 19

Gibt false für gültig oder true für ungültig zurück.

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)

Probieren Sie es online aus!

Wie?

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 ];

Für jeden Kartenrang in der Hand wird der entsprechende Steckplatz o[]erhöht. Sobald wir wieder mit einer Zeichenfolge verbunden sind, können wir die folgenden regulären Ausdrücke anwenden, um jeden Handtyp zu erkennen:

 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

Wenn die Hand keinen dieser regulären Ausdrücke auslöst, ist sie ungültig.

9(20*)

Der Phönix (dh der Platzhalter) wird einfach durch jeden möglichen Kartenrang ersetzt, beginnend mit dem höchsten, bis eine Übereinstimmung erkannt wird.

Arnauld
quelle
0

Python 3 , 466 455 403 401 399 Bytes

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))

Probieren Sie es online aus! Eingabe ist eine Liste von Händen, wobei Hand eine Liste von ganzen Zahlen 1 mit der folgenden Wertzuordnung ist:

  • 0: Phoenix
  • 1: Mah Jong
  • 2-13: 2 zu Ass
  • 14: Drache
  • 15: Hund
  • 16: Leere Zeichenfolge

1: Obwohl in den verknüpften TIO-Tests aus Bequemlichkeitsgründen mit einer Liste von Zeichenfolgen ausgedrückt wird, die vor dem Aufruf gemäß der Wertzuordnung übersetzt werden f

Nishioka
quelle