2010-08-12 13 views
5

Düz poker elini hesaplamak için bir ifade var mı? Ben gibi sıralanmış kartları temsil etmek dizeleri kullanıyorumDüz poker eli hesaplamak için düzenli ifade?

: düz (dizileri) değerlerini hesaplamak için nasıl

regexPair = Pattern.compile(".*(\\w)\\1.*#.*"); 
regexTwoPair = Pattern.compile(".*(\\w)\\1.*(\\w)\\2.*#.*"); 
regexThree = Pattern.compile(".*(\\w)\\1\\1.*#.*"); 
regexFour = Pattern.compile(".*(\\w)\\1{3}.*#.*"); 
regexFullHouse = Pattern.compile("((\\w)\\2\\2(\\w)\\3|(\\w)\\4(\\w)\\5\\5)#.*"); 
regexFlush = Pattern.compile(".*#(\\w)\\1{4}"); 

: Java'da

AAAAK#sssss = 4 aces and a king, all of spades. 
A2345#ddddd = straight flush, all of diamonds. 

, ben bu Regexes kullanıyorum regex ile?

DÜZENLEME

Aynı sorunu çözmek için başka bir soru açmak ancak kısa regex için char ASCII değerini, kullanarak. Ayrıntılar here.

Teşekkürler!

+11

Kullanılan regex'leri gördüğüm tüm tuhaf şeyler arasında, bu ikinci tuhaflık olmalı :-) – paxdiablo

+5

Bunu yapmak için normal ifadeler kullanmayın. –

+2

Çok Yaratıcı! – Doug

cevap

4

Düzenli ifadelerin bunu yapmak için düşündüğüm ilk araç olmadığını itiraf etmeliyim. Sıralanmamış bir el için bunu yapabilen herhangi bir RE'nin, eşdeğer prosedürel koddan çok daha çirkin ve çok daha az okunabilir olacağını garanti edebilirim. kartları varsayarsak

yüz değerine göre sıralanır (ve bunlar listelenen regexes ya işe yaramaz aksi gibi görünüyor) ve , sen

2345A|23456|34567|...|9TJQK|TJQKA 
gibi bir yapı kullanabileceği bir düzenli ifade kullanmalıdır Elin yüz değeri bölümünü bulmak için

. Ben ekledim hariç

Royal/straight flush: "(2345A|23456|34567|...|9TJQK|TJQKA)#(\\w)\\1{4}" 
Four of a kind:  ".*(\\w)\\1{3}.*#.*" 
Full house:   "((\\w)\\2\\2(\\w)\\3|(\\w)\\4(\\w)\\5\\5)#.*" 
Flush:    ".*#(\\w)\\1{4}" 
Straight:    "(2345A|23456|34567|...|9TJQK|TJQKA)#.*" 
Three of a kind:  ".*(\\w)\\1\\1.*#.*" 
Two pair:    ".*(\\w)\\1.*(\\w)\\2.*#.*" 
One pair:    ".*(\\w)\\1.*#.*" 
High card:   (none) 

Temelde, bu senin aynıdır: Ben "standart" ellerin here kadarıyla, şu azalan öncelik sırasına göre kontrol edilmelidir gelen Aslında

, kraliyet/düz floş ve düz. Onları sırayla kontrol ettiğinizde, elden en iyi puanı almalısınız. Yüksek kart için regeeks yok, o noktada, sahip olabileceğiniz tek puan.

Ayrıca, bu şekilde sıralanacağından, A2345 - 2345A arasındaki çelik tekerleği (etrafı çeviren) şeritleri değiştiririm.

+0

Anlaşmalı. Yukarıdaki regeksleri çalıştırın ve sonra straights için kontrol etmek için prosedür kodu çalıştırın. Bu oldukça basit olmalı - dize adım ve onlar sıralı olduklarından emin olun. – cincodenada

+1

@cincodenada: Evet, böyle yaparım. Ancak bazen, OP'lerin bunu belirli bir şekilde yapmak için iyi bir nedeni vardır (örneğin, yalnızca normal ifadeleri kullanabilen bir araç/çerçeve kullanıyor olabilirler). Bu yüzden, daha iyi bir yol olabileceğini önereceğim, yine de onlara yardım etmeye çalışacağım. Ben ilk başta fikri gelmedi ama ben onların kaynak kodu küçük ve zarif :-) – paxdiablo

+0

Doğru, bu yüzden cevabınızı yorumladı ve kendi kendime yapmadım. Ancak OP'ye şüphe parası vermenin yararına iyi bir hatırlatma. Teşekkürler :) – cincodenada