นี่เป็นการเล่น Tichu ที่ถูกต้องหรือไม่?


11

Tichuเป็นเกมไพ่ที่ผู้เล่นผลัดกันเล่นไพ่จากสำรับประกอบด้วยสำรับมาตรฐาน 52 ใบรวมทั้งไพ่เพิ่มอีก 4 ใบ:

  • มังกรซึ่งมีค่ามากกว่าบัตรอื่น ๆ
  • อินทผลัมซึ่งสามารถทำหน้าที่เป็นตัวแทน
  • สุนัขซึ่งผ่านการเปิดกับคู่ของคุณ
  • Mah Jongซึ่งมีมูลค่า 1 (และคนที่ถือมันเล่นครั้งแรก)

ผู้เล่นคนแรก (ผู้ที่ถูกกล่าวว่ามี "ลูกค้าที่มุ่งหวัง") สามารถเลือกที่จะเล่นชุดไพ่ประเภทใดประเภทหนึ่งต่อไปนี้:

  • เดียว (เช่น6)
  • คู่ ( JJ)
  • สาม ( 555)
  • เต็มบ้าน ( QQQ33) - สามและคู่
  • ตรง ( 56789) - 5 หรือบัตรติดต่อกันมากขึ้น
  • a Tractor ( 223344) - ลำดับคู่ใด ๆ ที่ต่อเนื่องกัน

ผู้เล่นที่ตามมาจะได้รับอนุญาตให้เล่นชุดไพ่ประเภทเดียวกัน แต่สูงกว่าอย่างเคร่งครัด ตัวอย่างเช่นQQสามารถเล่นได้ที่ด้านบนของJJแต่QQKKไม่สามารถ (เป็นแทรคเตอร์ไม่ใช่คู่) บ้านเต็มได้รับคำสั่งจากสาม (เช่น77722> 44499) และ straights และรถแทรกเตอร์จะต้องมีความยาวเท่ากัน ( 456789ไม่สามารถเล่นที่ด้านบนของ23456) เอซสูง

มีข้อยกเว้นหนึ่งประการ: ไพ่ 4 ใบใด ๆ ในการ์ดใบเดียวกันคือลูกระเบิดและสามารถเล่นได้บนยอดของสิ่งใดก็ได้ยกเว้นลูกระเบิดที่สูงกว่า 1

มังกรสามารถเล่นได้ด้วยตัวเองบนสุดของเดี่ยวหรือด้วยตะกั่ว (แต่ไม่มีที่อื่น) ต้นอินทผลัมนอกเหนือจากการเป็นตัวแทนแล้วยังสามารถเล่นได้บนยอดใดก็ได้ยกเว้นมังกร 2สุนัขสามารถเล่นได้ด้วยตัวเองเท่านั้นโดยมีตะกั่วและจบเทิร์นทันที 3


ความท้าทายของคุณคือการพิจารณาว่าการเล่น Tichu ที่กำหนดนั้นถูกต้องหรือไม่การเล่นก่อนหน้านี้

คุณอาจยอมรับการเล่นทั้งสองในลำดับใด ๆ เป็นรายการจำนวนเต็มหรือสตริง - ในกรณีใดกรณีหนึ่งคุณสามารถเลือกการแมปการ์ดกับจำนวนเต็ม / ตัวอักษร หากมีการเล่นก่อนหน้านี้มันจะถูกต้องเสมอและหากไม่ได้ (เช่นผู้เล่นมีการนำ) ข้อมูลแรกจะเป็นอาร์เรย์ / สตริงว่าง (ตรงกับประเภทของอินพุตอื่น) บัตรจะไม่รับประกันว่าจะได้รับในลำดับใด ๆ

ผลลัพธ์ของคุณจะต้องเลือกจากชุดของค่าที่แตกต่างกันสองค่าอย่างใดอย่างหนึ่งซึ่งบ่งบอกว่าการเล่นนั้นถูกกฎหมายและอีกอันหนึ่งที่บ่งบอกว่ามันไม่ได้เป็น

ไม่จำเป็นต้องทดสอบว่าชุดไพ่มีอยู่จริงในสำรับหรือไม่ (เช่น77766ตามด้วย88877เป็นไปไม่ได้เพราะมีเพียงสี่เจ็ด) - กรณีเช่นนี้จะไม่ได้รับ

ในกรณีทดสอบต่อไปนี้234567890JQKAแสดงถึง 2 ถึงเอซและ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 ทั้งหมดไม่รวมกันที่ถูกต้อง (เช่น777JJJ, 1234, 223355) อย่างไรก็ตามRPไม่ถูกต้อง: " มังกรสามารถเล่นได้ด้วยตัวเองบนยอดของเดี่ยวหรือด้วยตะกั่ว (แต่ไม่มีที่อื่น) "
Doorknob

อันที่จริงฉันเพิ่งจะแก้ไขความคิดเห็นของฉันเพื่อบอกว่ามือแรกทั้งหมดดูเหมือนจะถูกต้องเสมอ
Arnauld

1
@Arnauld Ah - ใช่คุณอาจถือว่ามือแรกทั้งหมดนั้นถูกต้อง
Doorknob

มันอาจคุ้มค่าที่จะพูดถึงว่า Phenix อาจไม่ถูกใช้เป็นสัญลักษณ์แทนในการวางระเบิด 5555 777Pควรเป็นการเล่นที่ไม่ถูกต้อง แต่ทั้งสองคำตอบปัจจุบันทำเครื่องหมายว่าถูกต้อง
Jitse

คำตอบ:


5

JavaScript (ES6),  274  273 ไบต์

(a)(b)ab

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

ส่งคืนfalseสำหรับถูกต้องหรือเป็นจริงสำหรับไม่ถูกต้อง

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 3 , 466 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))

ลองออนไลน์! อินพุตคือรายการของมือที่ hand คือรายการจำนวนเต็ม1 ที่มีการจับคู่ค่าต่อไปนี้:

  • 0: ฟีนิกซ์
  • 1: Mah Jong
  • 2-13: 2 ถึง Ace
  • 14: มังกร
  • 15: สุนัข
  • 16: สตริงว่าง

1: แม้ว่าในการทดสอบ TIO ที่เชื่อมโยงจะแสดงด้วยรายการของสตริงเนื่องจากความสะดวกสบายซึ่งมีการแปลตามการจับคู่ค่าก่อนการโทร f

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.