Bu geçerli bir Tichu oyunu mu?


11

Tichu , oyuncuların standart 52 kartlı desteden ve 4 ek karttan oluşan bir desteden sıralı kart setlerini oynadıkları bir kart oyunudur:

  • ejderha başka kart daha büyük bir değere sahip,
  • Phoenix bir Joker olarak hareket edebilir,
  • Köpek eşinize dönüş geçer,
  • Mah Jong 1 değerine sahip (ve kişi tutan birinci oynar),

İlk oyuncu ("kurşun" olduğu söylenen), aşağıdaki kart kombinasyonlarından birini oynamayı seçebilir:

  • bir tek (örneğin 6)
  • bir çift (JJ )
  • Bir üçlü ( 555)
  • Bir ful ( QQQ33) - Bir üçlü ve bir çift
  • Bir düz ( 56789) - 5 veya daha fazla ardışık kart
  • bir traktör ( 223344) - ardışık çiftler dizisi

Daha sonra gelen oyuncuların sadece aynı türden, ancak kesinlikle daha yüksek bir kart dizisi oynamasına izin verilir. Örneğin, QQüstünde oynanabilir JJ, ancak oynanamaz QQKK(bir traktör değil, bir çifttir). Dolu evler üçlü (örn. 77722> 44499) Tarafından sıralanır ve düzlükler ve traktörler aynı uzunlukta olmalıdır 456789(23456 ). Aslar yüksektir.

Bir istisna vardır: Aynı kartın 4 tanesi bombadır ve daha yüksek bir bomba dışında her şeyin üstünde oynanabilir. 1

Ejderha, tek başına veya kurşun ile kendi başına oynanabilir (ancak başka hiçbir yerde). Anka kuşu, joker karakter olmasının yanı sıra, ejderha dışında herhangi bir single da oynanabilir. 2 Köpek sadece kurşun ile oynanabilir ve dönüşü hemen bitirebilir. 3


Zorluğunuz, bir önceki Tichu oyununun geçerli olup olmadığını belirlemektir.

Her iki oyunu da herhangi bir sırayla tamsayı veya dize listesi olarak kabul edebilirsiniz - her iki durumda da, kartların tamsayılara / karakterlere eşlenmesini seçebilirsiniz. Önceki bir oynatma varsa, her zaman geçerli olacaktır ve eğer değilse (yani oyuncu kurşun içerir), ilk giriş boş dizi / dize olacaktır (diğer girişin türüyle eşleşir). Kartların belirli bir sırada verileceği garanti edilmez.

Çıktınız, biri oyunun yasal olduğunu ve diğerinin olmadığını gösteren tam olarak iki ayrı değer kümesinden seçilmelidir.

Kart setinin destede gerçekten var olup olmadığını test etmeye gerek yoktur (örn. Sadece dört 7 olduğu için 77766bunu takip etmek 88877imkansızdır) - bu gibi durumlar asla verilmeyecektir.

Aşağıdaki test örneklerinde, 234567890JQKA2'den asa ve RPD1ejderha, anka kuşu, köpek ve Mah Jong'i temsil eder. Boş dize burada olarak gösterilir -. Bu oyunlar yasal:

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

Ve bunlar değil:

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: aslında, aynı hizada bir bomba, ama bu oyunda kartların uygun olduğu tek yer olduğundan, basitlik uğruna dışarıda bırakmayı seçtim

2: değer ile bir kart üstüne oynanan anka değeri n aslında , n + 0.5 (a, 9 bir Phoenix olan bir 9 buçuk); Bu, hüküm vermek için ek tarih bilgisi gerektirdiğinden, hiçbir test vakası tek bir anka kuşunun üstünde tek bir oyun içermez

3: ilk giriş asla köpek olmayacak


Tüm geçerli birleşimidir değil @Arnauld (örn 777JJJ, 1234, 223355). Ancak, RPgeçerli değil: " Ejderha herhangi bir tek başına veya kurşun ile kendi başına çalınabilir (ama başka hiçbir yerde). "
Kapı Tokmağı

Gerçekten de, tüm ilk ellerin her zaman geçerli olduğunu söylemek için yorumumu düzenlemek üzereydim .
Arnauld

1
@Arnauld Ah - evet, tüm ilk ellerin geçerli olduğunu varsayabilirsiniz.
Kapı tokmağı

Bir Phenix'in bombada joker olarak kullanılamayabileceğinden bahsetmekte fayda var. 5555 777Pgeçersiz bir oyun olmalıdır, ancak her iki geçerli yanıt da geçerli olarak işaretler.
Jitse

Yanıtlar:


5

JavaScript (ES6),  274  273 bayt

(a)(b)ab

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

Geçerli için false , geçersiz için true döndürür .

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)

Çevrimiçi deneyin!

Nasıl?

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

Eldeki her kart sırası için, karşılık gelen yuva o[]artırılır. Bir dizeye geri katıldıktan sonra, her bir el türünü algılamak için aşağıdaki normal ifadeleri uygulayabiliriz:

 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

El bu normal ifadelerden herhangi birini tetiklemezse geçersizdir.

9(20*) desenin .

Anka kuşu (yani joker karakter), bir maç tespit edilene kadar en yüksek olandan başlayarak olası her kart sırası ile değiştirilir.


0

Python 3 , 466 455 403 401 399 bayt

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

Çevrimiçi deneyin! Girdi, elin aşağıdaki değer eşlemesine sahip tamsayılar 1 olduğu el listesidir :

  • 0: Phoenix
  • 1: Mah Jong
  • 2-13: 2'den As'a
  • 14: Ejderha
  • 15: Köpek
  • 16: Boş dize

1: Bağlantılı TIO testlerinde, aramadan önce değer eşlemesine göre çevrilen kolaylık nedeniyle dizelerin listesi ile ifade edilmesine rağmen f

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.