Đây có phải là một Tichu chơi hợp lệ?


11

Tichu là một trò chơi bài trong đó người chơi lần lượt chơi các bộ bài từ một bộ bài bao gồm một bộ bài 52 lá tiêu chuẩn, cùng với 4 lá bài bổ sung:

  • những con rồng , trong đó có một giá trị lớn hơn bất kỳ thẻ khác
  • các phượng , có thể hoạt động như một ký tự đại diện
  • những con chó , mà vượt qua lần lượt để đối tác của bạn
  • các Mah Jong , trong đó có giá trị 1 (và người giữ nó đóng đầu tiên)

Người chơi đầu tiên (người được cho là có "khách hàng tiềm năng") có thể chọn chơi một trong các loại kết hợp thẻ sau:

  • một đơn (ví dụ6 )
  • một cặp (JJ )
  • một bộ ba ( 555)
  • một ngôi nhà đầy đủ ( QQQ33) - một bộ ba và một cặp
  • một thẻ thẳng ( 56789) - 5 hoặc nhiều thẻ liên tiếp
  • một máy kéo ( 223344) - bất kỳ chuỗi liên tiếp nào

Người chơi sau đó chỉ được phép chơi một bộ bài cùng loại, nhưng hoàn toàn cao hơn. Ví dụ, QQcó thể được chơi trên đầu trang JJ, nhưng QQKKkhông thể (đó là máy kéo, không phải cặp). Nhà đầy đủ được sắp xếp theo bộ ba (ví dụ 77722> 44499), và dây đai và máy kéo phải có cùng chiều dài ( 456789không thể chơi trên đầu trang 23456). Ách cao.

Có một ngoại lệ: bất kỳ 4 lá bài nào cũng là một quả bom và có thể được chơi trên bất cứ thứ gì ngoại trừ một quả bom cao hơn. 1

Con rồng có thể tự chơi trên bất kỳ đĩa đơn nào hoặc bằng chì (nhưng không ở đâu khác). Chim phượng hoàng, ngoài việc là một ký tự đại diện, còn có thể được chơi trên bất kỳ đĩa đơn nào ngoại trừ rồng. 2 Con chó chỉ có thể tự chơi bằng chì và ngay lập tức kết thúc lượt chơi. 3


Thử thách của bạn là xác định xem một lần chơi Tichu nhất định có hợp lệ hay không, được đưa ra lần chơi trước.

Bạn có thể chấp nhận cả hai lần phát theo bất kỳ thứ tự nào dưới dạng danh sách các số nguyên hoặc chuỗi - trong cả hai trường hợp, bạn có thể chọn bất kỳ ánh xạ thẻ nào cho số nguyên / ký tự. Nếu có lần phát trước, nó sẽ luôn hợp lệ và nếu không (tức là người chơi có khách hàng tiềm năng), đầu vào đầu tiên sẽ là mảng / chuỗi trống (khớp với loại của đầu vào khác). Các thẻ không được đảm bảo để được đưa ra theo bất kỳ thứ tự cụ thể.

Đầu ra của bạn phải được chọn từ một tập hợp chính xác hai giá trị riêng biệt, một trong số đó cho biết vở kịch là hợp pháp và một giá trị cho thấy nó không hợp lệ.

Không cần kiểm tra xem bộ thẻ có thực sự tồn tại trong bộ bài hay không (ví dụ: 77766theo sau là88877 là không thể vì chỉ có bốn 7) - những trường hợp như vậy sẽ không bao giờ được đưa ra.

Trong các trường hợp thử nghiệm sau đây, 234567890JQKAđại diện cho 2 thông qua ace và RPD1đại diện cho rồng, phượng, chó và Mah Jong tương ứng. Chuỗi rỗng được hiển thị ở đây là -. Những vở kịch này là hợp pháp:

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

Và đây không phải là:

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: thực ra, một cú đánh thẳng cũng là một quả bom, nhưng vì đây là nơi duy nhất trong trò chơi mà bộ bài có vấn đề, tôi đã chọn bỏ nó đi vì đơn giản

2: giá trị của con phượng hoàng được chơi trên đầu thẻ có giá trị n thực sự là n + 0,5 (một con phượng hoàng trên số 9 là 9 rưỡi); vì điều này đòi hỏi kiến ​​thức về lịch sử bổ sung để phân xử, không có trường hợp thử nghiệm nào liên quan đến một lần chơi trên đầu một con phượng hoàng

3: vì vậy, đầu vào đầu tiên sẽ không bao giờ là con chó


@Arnauld Không phải tất cả là sự kết hợp hợp lệ (ví dụ như 777JJJ, 1234, 223355). Tuy nhiên, RPkhông hợp lệ: " Con rồng có thể tự chơi trên bất kỳ đĩa đơn nào hoặc bằng chì (nhưng không ở đâu khác). "
Doorknob

Thật vậy, tôi chỉ định chỉnh sửa nhận xét của mình để nói rằng tất cả những bàn tay đầu tiên dường như luôn luôn hợp lệ.
Arnauld

1
@Arnauld Ah - vâng, bạn có thể cho rằng tất cả các tay đầu tiên là hợp lệ.
Doorknob

Điều đáng nói là Phenix có thể không được sử dụng làm ký tự đại diện trong bom. 5555 777Pnên là một trò chơi không hợp lệ, nhưng cả hai câu trả lời hiện tại đều đánh dấu nó là hợp lệ.
Jitse

Câu trả lời:


5

JavaScript (ES6),  274  273 byte

(a)(b)ab

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

Trả về false cho hợp lệ hoặc true cho không hợp lệ.

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)

Hãy thử trực tuyến!

Làm sao?

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

Đối với mỗi cấp bậc thẻ trong tay, vị trí tương ứng o[]được tăng lên. Sau khi nối lại chuỗi, chúng ta có thể áp dụng các biểu thức chính quy sau để phát hiện từng loại tay:

 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

Nếu bàn tay không kích hoạt bất kỳ biểu thức thông thường nào trong số này, thì nó không hợp lệ.

9(20*)

Phượng hoàng (tức là ký tự đại diện) chỉ được thay thế bằng mỗi cấp bậc thẻ có thể, bắt đầu bằng thứ hạng cao nhất, cho đến khi phát hiện ra một trận đấu.


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

Hãy thử trực tuyến! Đầu vào là danh sách các tay trong đó tay là danh sách các số nguyên 1 với ánh xạ giá trị sau:

  • 0: Phượng hoàng
  • 1: Mah Jong
  • 2-13: 2 đến Ace
  • 14: Rồng
  • 15: Chó
  • 16: Chuỗi rỗng

1: Mặc dù trong các thử nghiệm TIO được liên kết được thể hiện bằng danh sách các chuỗi do sự thuận tiện được dịch theo ánh xạ giá trị trước khi gọi f

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.