이것은 유효한 티추 게임입니까?


11

티추 (Tichu) 는 플레이어가 표준 52 장의 카드 덱과 4 장의 추가 카드로 구성된 덱에서 카드 세트를 차례대로 플레이하는 카드 게임입니다.

  • 다른 카드보다 더 큰 값을 가지며,
  • 와일드 카드 역할을 할 수 있는 피닉스
  • 파트너로 회전을 통과,
  • 마작 값 1을 가지고 (그 사람 잡고 처음 재생)

첫 번째 플레이어 ( "리드"가 있다고 함)는 다음 유형의 카드 조합 중 하나를 재생하도록 선택할 수 있습니다.

  • 하나 (예를 들어 6)
  • ( JJ)
  • 트리플 ( 555)
  • 풀 하우스 ( QQQ33) - 트리플과 한 쌍의
  • 직선 ( 56789) - 5 개 이상의 연속 카드
  • 트랙터 ( 223344) - 쌍 어떤 연속적인 순서

그 후의 플레이어는 같은 종류의 카드 만 사용할 수 있지만 엄격하게 더 높은 카드를 사용할 수 있습니다. 예를 들어, QQ위에 재생할 수 JJ있지만, QQKK수 없다 (이는 트랙터 아닌 쌍). 풀 하우스는 트리플 (예 : 77722> 44499) 로 주문되며 스트레이트와 트랙터의 길이는 같아야합니다 ( 456789위에서 플레이 할 수 없음 23456). 에이스가 높습니다.

한 가지 예외가 있습니다. 동일한 카드 중 4 개가 폭탄 이고 폭탄이 더 높은 것을 제외하고는 무엇이든 사용할 수 있습니다. 1

드래곤은 단독으로 또는 리드와 함께 (그 밖의 다른 곳에서는) 스스로 플레이 할 수 있습니다. 와일드 카드가 아닌 피닉스는 드래곤을 제외한 모든 싱글 위에서 플레이 할 수 있습니다. 2 개는 혼자서만 리드를 할 수 있으며 턴을 즉시 종료합니다.


당신의 도전은 주어진 Tichu 플레이가 이전 플레이에서 유효한지 결정하는 것입니다.

정수 나 문자열 목록으로 어떤 순서로든 두 가지 놀이를 모두 받아 들일 수 있습니다. 두 경우 모두 정수 / 문자에 대한 카드 매핑을 선택할 수 있습니다. 이전 플레이가 있었다면 항상 유효하며, 그렇지 않은 경우 (즉, 플레이어가 리드를 가지고있는 경우) 첫 번째 입력은 빈 배열 / 문자열 (다른 입력의 유형과 일치)이됩니다. 카드는 특정 순서대로 제공되지 않습니다.

당신의 결과물은 정확히 두 가지 구별되는 값들 중에서 선택되어야합니다.

(예를 들어,이 카드의 세트가 실제로 갑판에 있는지 여부에 대한 시험을 할 필요가 없습니다 77766다음에 88877이런 경우가 주어지지 않을 것입니다 - 네 개의 7의가 있기 때문에 불가능은).

다음 테스트 사례에서 234567890JQKA2에서 에이스까지, 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"유효하지 않습니다." 용은
혼자서

실제로, 나는 모든 손이 항상 유효한 것처럼 보이기 위해 내 의견을 편집하려고했습니다 .
Arnauld

1
@Arnauld Ah-그렇습니다, 당신은 모든 첫 손이 유효하다고 가정 할 수 있습니다.
Doorknob

Phenix가 폭탄에서 와일드 카드로 사용되지 않을 수도 있습니다. 5555 777P유효하지 않은 플레이 여야하지만 현재 답변 모두 유효합니다.
Jitse

답변:


5

자바 스크립트 (ES6),  (274)  273 바이트

(a)(b)

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

phoenix (즉, 와일드 카드)는 일치하는 항목이 검색 될 때까지 가장 높은 카드부터 시작하여 가능한 각 카드 순위로 간단히 바뀝니다.


0

파이썬 (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))

온라인으로 사용해보십시오! 입력 값은 손의 목록입니다. 여기서 손은 다음 값 매핑 의 정수 1 입니다.

  • 0 : 피닉스
  • 1 : 마작
  • 2-13 : 2에서 에이스
  • 14 : 용
  • 15 : 개
  • 16 : 빈 문자열

1 : 연결된 TIO 테스트에서 편의상 문자열 목록으로 표현되지만 호출하기 전에 값 매핑에 따라 변환됩니다. f

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.