Czy to ważna gra Tichu?

11

Tichu to gra karciana, w której gracze na zmianę grają zestawami kart z talii składającej się ze standardowej talii 52 kart plus 4 dodatkowe karty:

  • smok , który ma wartość większą niż jakakolwiek inna karta
  • feniks , który może działać jako zamiennika
  • pies , który przechodzi kolejno do swojego partnera
  • Mah Jong , który ma wartość 1 (a osoba posiadająca to gra pierwszy)

Pierwszy gracz (o którym mówi się, że ma „lead”) może zagrać w jeden z następujących rodzajów kombinacji kart:

  • pojedynczy (na przykład 6)
  • pary ( JJ)
  • potrójne ( 555)
  • full ( QQQ33) - potrójne i parę
  • prostym ( 56789) - 5 lub więcej kolejnych kart
  • ciągnik ( 223344) - każdy z rzędu sekwencji par

Kolejni gracze mogą wtedy zagrać tylko zestaw kart tego samego typu, ale ściśle wyższych. Na przykład QQmożna na nim grać JJ, ale QQKKnie można (to ciągnik, a nie para). Potrójne domy są sortowane według potrójnego (np. 77722> 44499), A strity i traktory muszą być tej samej długości ( 456789nie można na nich grać 23456). Asy są wysokie.

Jest jeden wyjątek: dowolna 4 z tej samej karty jest bombą i można na nią zagrać z wyjątkiem dowolnej wyższej bomby. 1

W smoka można grać samodzielnie na dowolnym singlu lub ołowiu (ale nigdzie indziej). Feniksa, oprócz tego, że jest symbolem wieloznacznym, można również grać na dowolnym singlu oprócz smoka. 2 Z psem można grać samemu ołowiem i natychmiast kończy on turę. 3)


Twoim wyzwaniem jest ustalenie, czy dana gra Tichu jest ważna, biorąc pod uwagę poprzednią grę.

Możesz zaakceptować obie gry w dowolnej kolejności jako listy liczb całkowitych lub ciągów znaków - w obu przypadkach możesz wybrać dowolne mapowanie kart na liczby całkowite / postacie. Jeśli była poprzednia gra, zawsze będzie ważna, a jeśli nie (tj. Gracz ma lead), pierwszym wejściem będzie pusta tablica / ciąg znaków (odpowiadający typowi drugiego wejścia). Nie gwarantuje się, że karty zostaną wydane w określonej kolejności.

Twój wynik musi być wybrany z zestawu dokładnie dwóch różnych wartości, z których jedna wskazuje, że gra jest legalna, a druga nie.

Nie ma potrzeby sprawdzania, czy zestaw kart faktycznie istnieje w talii (np. 77766Po nim 88877jest niemożliwe, ponieważ są tylko cztery 7) - takie przypadki nigdy nie zostaną podane.

W poniższych przypadkach testowych 234567890JQKAreprezentuj od 2 do asa i RPD1odpowiednio smok, feniks, pies i Mah Jong. Pusty ciąg jest pokazany tutaj jako -. Te sztuki są legalne:

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

A to nie są:

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: w rzeczywistości strit jest również bombą, ale ponieważ jest to jedyne miejsce w grze, w którym ma znaczenie kolor kart, postanowiłem go pominąć dla uproszczenia

2: wartość feniksa zagranego na karcie o wartości n wynosi w rzeczywistości n + 0,5 (feniks na 9 to 9 i pół); ponieważ wymaga to znajomości dodatkowej historii, żadne przypadki testowe nie obejmują pojedynczego granego na jednym feniksie

3: więc pierwszym wejściem nigdy nie będzie pies

Klamka
źródło
@Arnauld Nie wszystkie kombinacje są ważne (np 777JJJ, 1234, 223355). Nie RPjest to jednak ważne: „ Smok może być rozgrywany samodzielnie na dowolnym singlu lub ołowiu (ale nigdzie indziej).
Klamka
Rzeczywiście, właśnie miałem edytować swój komentarz, aby powiedzieć, że wszystkie pierwsze rozdania wydają się zawsze ważne.
Arnauld,
1
@Arnauld Ah - tak, możesz założyć, że wszystkie pierwsze rozdania są ważne.
Klamka
Warto wspomnieć, że Phenix nie może być używany jako symbol wieloznaczny w bombie. 5555 777Ppowinna być nieważna, ale obie aktualne odpowiedzi oznaczają ją jako prawidłową.
Jitse,

Odpowiedzi:

5

JavaScript (ES6),  274  273 bajtów

(a)(b)zab

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

Zwraca false dla poprawnego lub true dla niepoprawnego.

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)

Wypróbuj online!

W jaki sposób?

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

Dla każdej rangi karty w ręce zwiększa się odpowiadające jej miejsce o[]. Po ponownym połączeniu z ciągiem znaków możemy zastosować następujące wyrażenia regularne, aby wykryć każdy typ ręki:

 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

Jeśli ręka nie wyzwala żadnego z tych wyrażeń regularnych, jest niepoprawna.

9(20*) wzoru.

Feniks (tj. Symbol wieloznaczny) jest po prostu zastępowany każdą możliwą rangą karty, zaczynając od najwyższej, aż do wykrycia dopasowania.

Arnauld
źródło
0

Python 3 , 466 455 403 401 399 bajtów

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

Wypróbuj online! Dane wejściowe to lista rąk, gdzie ręka to lista liczb całkowitych 1 z następującym odwzorowaniem wartości:

  • 0: Phoenix
  • 1: Mah Jong
  • 2-13: 2 do Asa
  • 14: Smok
  • 15: Pies
  • 16: Pusty ciąg

1: Chociaż w połączonych testach TIO są wyrażane za pomocą listy ciągów ze względu na wygodę, które są tłumaczone zgodnie z mapowaniem wartości przed wywołaniem f

Nishioka
źródło