Apakah ini permainan Tichu yang valid?

11

Tichu adalah permainan kartu di mana para pemain bergiliran memainkan set kartu dari setumpuk yang terdiri dari setumpuk 52 kartu standar, ditambah 4 kartu tambahan:

  • yang naga , yang memiliki nilai lebih besar dari kartu lain
  • yang phoenix , yang dapat bertindak sebagai wildcard
  • yang anjing , yang melewati gilirannya untuk pasangan Anda
  • yang Mah Jong , yang memiliki nilai 1 (dan orang memegangnya memainkan pertama)

Pemain pertama (yang dikatakan memiliki "lead") dapat memilih untuk memainkan salah satu jenis kombinasi kartu berikut:

  • satu tunggal (misalnya 6)
  • a pair ( JJ)
  • a tiga ( 555)
  • sebuah rumah penuh ( QQQ33) - triple dan sepasang
  • a straight ( 56789) - 5 atau lebih kartu berturut-turut
  • a traktor ( 223344) - setiap urutan berturut-turut pasangan

Para pemain selanjutnya hanya diperbolehkan memainkan satu set kartu dengan jenis yang sama, tetapi benar-benar lebih tinggi. Misalnya, QQdapat dimainkan di atas JJ, tetapi QQKKtidak dapat (itu adalah traktor, bukan pasangan). Rumah penuh dipesan oleh triple (mis. 77722> 44499), Dan lurus dan traktor harus sama panjang ( 456789tidak bisa dimainkan di atas 23456). As tinggi.

Ada satu pengecualian: setiap 4 kartu yang sama adalah bom , dan dapat dimainkan di atas apa pun kecuali bom yang lebih tinggi. 1

Naga dapat dimainkan dengan sendirinya di atas satu atau dengan memimpin (tetapi tidak ada tempat lain). Burung phoenix, selain sebagai wildcard, juga dapat dimainkan di atas satu pun kecuali naga. 2 Anjing hanya bisa dimainkan sendiri dengan timah dan langsung mengakhiri belokan. 3


Tantangan Anda adalah untuk menentukan apakah permainan Tichu yang diberikan valid, mengingat permainan sebelumnya.

Anda dapat menerima kedua permainan dalam urutan apa pun sebagai daftar bilangan bulat atau string - dalam kedua kasus tersebut, Anda dapat memilih pemetaan kartu apa pun untuk bilangan bulat / karakter. Jika ada permainan sebelumnya, itu akan selalu valid, dan jika tidak (yaitu pemain telah memimpin), input pertama akan menjadi array / string kosong (cocok dengan jenis input lainnya). Kartu tidak dijamin diberikan dalam urutan tertentu.

Output Anda harus dipilih dari satu set yang persis dua nilai berbeda, salah satunya menunjukkan permainan itu legal dan satu yang menunjukkan bukan.

Tidak perlu untuk menguji apakah set kartu benar-benar ada di dek (misalnya 77766diikuti oleh 88877tidak mungkin karena hanya ada empat 7) - kasus-kasus seperti itu tidak akan pernah diberikan.

Dalam kasus uji berikut, 234567890JQKAmewakili 2 melalui ace, dan RPD1mewakili masing-masing naga, phoenix, anjing, dan Mah Jong. String kosong ditampilkan di sini sebagai -. Drama ini 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

Dan ini bukan:

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: sebenarnya, straight flush juga merupakan bom, tetapi karena ini adalah satu-satunya tempat dalam permainan yang sesuai dengan kartu, aku telah memilih untuk meninggalkannya demi kesederhanaan

2: nilai phoenix yang dimainkan di atas kartu dengan nilai n sebenarnya n + 0,5 (phoenix pada angka 9 adalah angka sembilan setengah); karena ini membutuhkan pengetahuan tentang sejarah tambahan untuk diputuskan, tidak ada kasus uji yang melibatkan satu pun yang dimainkan di atas satu phoenix

3: jadi input pertama tidak akan menjadi anjing

Gagang pintu
sumber
@Arnauld Tidak semua kombinasi yang valid (mis 777JJJ. 1234, 223355). Namun, RPtidak valid: " Naga itu dapat dimainkan dengan sendirinya di atas satu atau dengan pemimpin (tetapi tidak di tempat lain). "
Doorknob
Memang, saya baru saja akan mengedit komentar saya untuk mengatakan bahwa semua tangan pertama tampaknya selalu valid.
Arnauld
1
@Arnauld Ah - ya, Anda dapat menganggap semua tangan pertama adalah sah.
Gagang Pintu
Mungkin perlu disebutkan bahwa Phenix tidak dapat digunakan sebagai wildcard dalam sebuah bom. 5555 777Pseharusnya merupakan permainan yang tidak valid, tetapi kedua jawaban saat ini menandainya valid.
Jitse

Jawaban:

5

JavaScript (ES6),  274  273 byte

Mengambil input sebagai (a)(b), di mana dan adalah array bilangan bulat dengan:ab

  • 1 = anjing
  • 3 = Mah Jong
  • 4..16 = 2 ... Ace
  • 18 = naga
  • 19 = phoenix

Pengembalian salah untuk valid atau benar untuk tidak valid.

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)

Cobalah online!

Bagaimana?

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

Untuk setiap peringkat kartu di tangan, slot yang sesuai di o[]bertambah. Setelah bergabung kembali ke string, kita dapat menerapkan ekspresi reguler berikut untuk mendeteksi setiap jenis tangan:

 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

Jika tangan tidak memicu salah satu dari ekspresi reguler ini, itu tidak valid.

9(20*)

Phoenix (yaitu wildcard) hanya diganti dengan setiap peringkat kartu yang mungkin, mulai dari yang tertinggi, hingga kecocokan terdeteksi.

Arnauld
sumber
0

Python 3 , 466 455 403 401 399 byte

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

Cobalah online! Input adalah daftar tangan di mana tangan adalah daftar bilangan bulat 1 dengan pemetaan nilai berikut:

  • 0: Phoenix
  • 1: Mah Jong
  • 2-13: 2 untuk Ace
  • 14: Naga
  • 15: Anjing
  • 16: String kosong

1: Meskipun dalam tes TIO tertaut diungkapkan dengan daftar string karena kemudahan yang diterjemahkan sesuai dengan pemetaan nilai sebelum menelepon f

Nishioka
sumber