É uma peça válida de Tichu?

11

Tichu é um jogo de cartas no qual os jogadores se revezam jogando conjuntos de cartas de um baralho que consiste em um baralho de 52 cartas padrão e mais 4 cartas adicionais:

  • o dragão , que tem um valor maior do que qualquer outra carta
  • a fênix , que pode atuar como um curinga
  • o cachorro , que passa a vez para o seu parceiro
  • o Mah Jong , que tem valor 1 (e a pessoa que o segura toca primeiro)

O primeiro jogador (que se diz ter "liderança") pode optar por jogar um dos seguintes tipos de combinação de cartas:

  • um único (por exemplo 6)
  • um par ( JJ)
  • um triplo ( 555)
  • uma casa cheia ( QQQ33) - um triplo e um par
  • uma sequência ( 56789) - 5 ou mais cartas consecutivas
  • a tractor ( 223344) - qualquer sequência consecutiva de pares

Jogadores subseqüentes só podem jogar um baralho do mesmo tipo, mas estritamente mais alto. Por exemplo, QQpode ser jogado em cima JJ, mas QQKKnão pode (é um trator, não um par). Casas completas são ordenadas pelo triplo (por exemplo, 77722> 44499), e as retas e tratores devem ter o mesmo comprimento ( 456789não pode ser jogado por cima 23456). Ases são altos.

Há uma exceção: qualquer 4 da mesma carta é uma bomba e pode ser jogado em cima de qualquer coisa, exceto uma bomba mais alta. 1

O dragão pode ser jogado sozinho sobre qualquer single ou com chumbo (mas em nenhum outro lugar). A fênix, além de ser um curinga, também pode ser tocada em cima de qualquer single, exceto o dragão. 2 O cão só pode ser jogado sozinho com chumbo e imediatamente termina o turno. 3


Seu desafio é determinar se uma determinada jogada de Tichu é válida, dada a jogada anterior.

Você pode aceitar as duas jogadas em qualquer ordem como listas de números inteiros ou seqüências de caracteres - em ambos os casos, você pode escolher qualquer mapeamento de cartas para números inteiros / caracteres. Se houve uma jogada anterior, ela sempre será válida e, caso contrário (ou seja, o jogador tem vantagem), a primeira entrada será a matriz / sequência vazia (correspondente ao tipo da outra entrada). Não é garantido que os cartões sejam entregues em qualquer ordem específica.

Sua saída deve ser selecionada de um conjunto de exatamente dois valores distintos, um dos quais indica que a reprodução é legal e outra que indica que não.

Não há necessidade de testar se o conjunto de cartas realmente existe no baralho (por exemplo, 77766seguido por 88877é impossível porque existem apenas quatro 7) - esses casos nunca serão dados.

Nos seguintes casos de teste, 234567890JQKArepresente 2 a ás e RPD1represente o dragão, a fênix, o cachorro e o Mah Jong, respectivamente. A cadeia vazia é mostrada aqui como -. Essas peças são legais:

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

E estes não são:

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: na verdade, um straight flush também é uma bomba, mas como esse é o único lugar no jogo em que o naipe é importante, eu escolhi deixá-lo de fora por uma questão de simplicidade

2: o valor da fênix jogada em cima de uma carta com o valor n é realmente n + 0,5 (uma fênix em um 9 é um 9 e meio); uma vez que isso requer conhecimento de histórico adicional para ser julgado, nenhum caso de teste envolve uma única jogada em cima de uma única fênix

3: então a primeira entrada nunca será cachorro

Maçaneta da porta
fonte
@Arnauld Nem todos são combinações válidas (por exemplo 777JJJ, 1234, 223355). No entanto, RPnão é válido: " O dragão pode ser jogado sozinho em cima de qualquer single ou com chumbo (mas em nenhum outro lugar). "
Maçaneta da porta
Na verdade, eu estava prestes a editar meu comentário para dizer que todas as primeiras mãos parecem sempre válidas.
Arnauld
11
@ Arnauld Ah - sim, você pode assumir que todas as primeiras mãos são válidas.
Maçaneta
Vale ressaltar que um Phenix não pode ser usado como curinga em uma bomba. 5555 777Pdeve ser uma reprodução inválida, mas as duas respostas atuais a marcam como válida.
Jitse

Respostas:

5

JavaScript (ES6),  274273  bytes

(a)(b)ab

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

Retorna false para válido ou true para inválido.

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)

Experimente online!

Como?

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

Para cada classificação de cartas na mão, o slot correspondente o[]é incrementado. Depois de voltar a uma string, podemos aplicar as seguintes expressões regulares para detectar cada tipo de mã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

Se a mão não acionar nenhuma dessas expressões regulares, é inválida.

9(20*)

A fênix (ou seja, o curinga) é simplesmente substituída por cada classificação possível, começando pela mais alta, até que uma correspondência seja detectada.

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

Experimente online! Entrada é uma lista de ponteiros em que ponte é uma lista de números inteiros 1 com o seguinte mapeamento de valores:

  • 0: Phoenix
  • 1: Mah Jong
  • 2-13: 2 para Ace
  • 14: Dragão
  • 15: Cão
  • 16: String vazia

1: Embora os testes TIO vinculados sejam expressos com uma lista de seqüências de caracteres devido à conveniência, que são traduzidas de acordo com o mapeamento de valores antes de chamar f

Nishioka
fonte