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


@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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.