Poker eli adı


22

Poker eli adı

Beş kart verildiğinde, poker elinin adını yazınız:

High card
One pair
Two pair
Three of a kind
Straight
Flush
Full house
Four of a kind
Straight flush
Royal Flush

Şüpheniz varsa, http://en.wikipedia.org/wiki/List_of_poker_hands adresindeki kurallara bakın .

Giriş

Stdin veya komut satırı argümanlarından 5 kart . Bir kart, formdaki RSR harfinin ve S'nin uygun olduğu iki harfli bir dizedir . Rütbeleri şunlardır 2- 9(sayı kartları), T(on), J(Jack), Q(Kraliçe), K(Kral), A(As). Takım elbise vardır S, D, H, Csırasıyla maça, karo, kupa ve kulüpleri için.

Kart örneği

5H - five of hearts
TS - ten of spades
AD - ace of diamonds

Girdi örneği => istenen çıktı

3H 5D JS 3C 7C => One pair
JH 4C 2C JD 2H => Two pair
7H 3S 7S 7D 7C => Four of a kind
8C 3H 8S 8H 3S => Full house

kurallar

En kısa kod kazanır

Düzenle

Şimdiye kadar harika görünüyorsun! Tüm cevapları gerçekten doğrulayamıyorum, çünkü bu dilleri çok iyi tanımıyorum ve hepsi için derleyici / tercüman yok, ama herkesin Asların hem en yüksek olabileceğini düşündüğünden şüphelenmiyorum. bir Straight (floş) en düşük kartları .


2
Yığın Taşması ile ilgili belli belirsiz bir oldie var .
dmckee

İstediğiniz gibi el adlarını büyük harf kullanmamıza (veya almamasına) izin var mı?
Mr.Wizard

Bay Sihirbaz, elbette.
daniero

Yanıtlar:


3

GolfScript ( 209 208 207 206 200 199 197 196 karakter)

3/zip:^0={10,''*"TJQKA"+?}/]:?15,{?\{=}+,,}%2,-$6,14.),++@$/):|;[!!2*^1=.&,(!+5+]or{/}*'Full house
Two pair
One pair
ThreeKFourKHigh card
Flush
Straight''K'/' of a kind
'*n/~|1$"Royal"if" "+2$+](=

Önerilen büyük harf kullanımı için verilen özgürlüğü kullanıyorum: Düz Flush ve Royal Flush, basit flush kelimesini tekrar kullanmak için Flush’ın her ikisini de büyük harf kullanmaktadır.

Not: Daha önceki bazı sürümler buggy 'dir: tam çifti sadece kraliyet çiftinden daha düşük değerdeyken desteklediler. A - 0ile ayıran boşluğu değiştirerek düzeltilebilirler $.

gösteri


Şimdi bu bir golf programı! Kısaltmak için yollar arıyordum ama hiçbir şey bulamıyorum. .&Bir dizedeki farklı karakterleri bulmak için kullanmak çok yararlı bir püf noktasıdır.
Cristian Lupascu

@ w0lf, bu oldukça standart bir hiledir. Howard çözümünde de kullanıyor.
Peter Taylor

8

Benim bir cevabı ile geldi :)

Python - 312 301 298

R,K,F,S,g=' 23456789TJQKA2345A',' of a Kind','Flush','Straight ',sorted
s,r=''.join(g(raw_input(),key=R.find)).split()
n,m=g(map(r.count,set(r)))[-2:]
print[[F,[0,'High Card','TOwnoe'[n&1::2]+' Pair',['Full House','Three'+K][n&1],'Four'+K][m]],[[S,'Royal '][r[0]=='T']+F,S]][r in R][len(set(s))>1]

İki boyutun indekslerinin floş ve düz için bool çekleri olduğu 2x2 bir liste oluşturur. Her ikisinde de, floş royal olup olmadığını ya da sadece floş olup olmadığını kontrol ediyoruz. Floş değil düz değil için, diğer eller için kontrol edin: mve naynı rütbe kartlarının en yüksek ve ikinci en yüksek miktarı tutar; Ellerin isimleri, göre indeksleri olan bir listede saklanır m. Bu listenin değerleri içindeki alt kontroller nbir çifti iki çiftten ve üçünü de evden ayırmak için yapılır .

Düzenleme: Toplam 20 karakter için teşekkürler Nolen Royality!


1
... ve benimkini döv.
Mr.Wizard

Yeni çözümü seviyorum, 312 karakter oldukça küçük. İki ya da iki çifte karşı çok akıllıca bir yöntem: D
Nolen Royalty

Teşekkürler :) İsterseniz deneyebilirsiniz. Fakat belki de m ve n ile aynı değişkenleri kullanmıyorsunuzdur. Bunu kontrol edip kodunuzu tekrar izlerken, sadece orjinalini biraz daha tıraş edebileceğimi fark ettim ^^
daniero

1
Eğer geçiş yaparak başka 8 karakter kaybetmez Could m,n=g([c.count(x)for x in set(r)])için m,n=g(map(c.count,set(r)))?
Nolen Royalty

Woah, çok haklısın, yapabilirim: D Neden aklımdan çıkmış bilmiyorum. İyi yakala, teşekkürler!
daniero

5

Yakut 1.9 (427 359 348 338 296 292)

EDIT : Düşük aslarla çalışması düzeltildi.

o,p=%w(flush straight)
f=/1{5}|1{4}0+1$/
s=[0]*13
puts Hash[*$*.map{|c|s['23456789TJQKA'.index c[0]]+=1;c[1]}.uniq[1]?[f,p,?4,'four'+a=' of a kind',/3.*2|2.*3/,'full house',?3,'three'+a,/2.*2/,'two pair',?2,'one pair',0,'high card']:[/1{5}$/,'royal '+o,f,p+' '+o,0,o]].find{|r,y|s.join[r]}[1]

Temel fikir, her bir sıradaki kart miktarının bir dizisini oluşturmak, sayıları bir dizede birleştirmek ve ardından hangi el şeklinin uyduğunu görmek için düzenli ifadeler çalıştırmaktır. Farklı yıkamalara (floş, düz floş, floş floş) veya diğer şekillere (başka her şey) karşı kontrol edilip edilmeyeceğini belirlemek için farklı kıyafetlerin sayısını sayarız.

Kartları şu şekilde ayrı komut satırı argümanları gibi alır:

>ruby poker-hand-golf.rb 3H 5D JS 3C 7C
one pair

4

C, 454 karakter

#define L for(a=1;a<6;a++)for(b=0;b<13;b++)
#define U u[b+6]
#define R(x,y) if(x)puts(#y);else
b,f,r,h=0,s=0,u[20]={0};main(int a,char**v){L U+=v[a][0]=="23456789TJQKA"[b];f=v[1][1];L{if(v[a][1]!=f)f=0;u[a]+=a==U;if(b>7)h+=U;if(a*13+b<64||!U)r=0;else if(++r==5)s=1;}R(f&&h==25,Royal flush)R(f&&s,Straight flush)R(u[4],Four of a kind)R(u[3]&&u[2],Full house)R(f,Flush)R(s,Straight)R(u[3],Three of a kind)R(u[2]==2,Two pair)R(u[2],One pair)R(h,High card);}

Komut satırından argüman olarak kartlarla çalıştırın, örneğin ./a.out 8C 3H 8S 8H 3S

Genişletilmiş versiyon, yorumlarla:

#define L for(a=1;a<6;a++)for(b=0;b<13;b++)
#define R(x,y) if(x)puts(#y);else
#define U u[b+6]
b,f,r,h=0,s=0,u[20]={0};
main(int a,char**v){
    // card usage - u[6..]
    L U+=v[a][0]=="23456789TJQKA"[b];
    // NOTE: lets expand the inner body of the loop in the answer so this looks more sane:
    // flush
    f=v[1][1];L if(v[a][1]!=f)f=0;
    // count of usages - u[0..5] 
    L u[a]+=a==U;
    // high cards x5
    L if(b>7)h+=U;
    // straights
    L if(a*13+b<64||!U)r=0;else if(++r==5)s=1;        
    // display
    R(f&&h==25,Royal flush)
    R(f&&s,Straight flush)
    R(u[4],Four of a kind)
    R(u[3]&&u[2],Full house)
    R(f,Flush)
    R(s,Straight)
    R(u[3],Three of a kind)
    R(u[2]==2,Two pair)
    R(u[2],One pair)
    R(h,High card);    
}

Düzenlemeler:

  1. Döngüleri birleştirip yeniden kullanarak 12 karakter kurtardı.
  2. Sabit dize sabitleyerek 9 karakter kurtarıldı.
  3. Makroda iğneleme kullanılarak 19 karakter kaydedildi

3

Mathematica , 365

İşte David Carraher'in cevabını benim almam.

Bazı okunabilirlik için beyaz boşluk ile gösterilir.

If[
  a = Characters;
  x = Thread;
  r = Range;
  d = Sort[a@StringSplit@# /. x[a@"23456789TJQKA" -> 2~r~14]];
  {t, u} = Sort[Last /@ Tally@#] & /@ x@d;
  c = First /@ d;
  f = u == {5};
  S = "Straight";
  c == r[b = d[[1, 1]], b + 4],
  If[f,
   If[c == 10~r~14, "Royal Flush", S <> " flush"], S],
  If[f, "Flush",
   Switch[t,
    {_, 4},    "Four of a kind",
    {2, 3},    "Full house",
    {__, 3},   "Three of a kind",
    {_, 2, 2}, "Two pair",
    {__, 2},   "One pair",
    _,         "High card"]
  ]
] &

Bir satır versiyonu:

If[a=Characters;x=Thread;r=Range;d=Sort[a@StringSplit@#/.x[a@"23456789TJQKA"->2~r~14]];{t,u}=Sort[Last/@Tally@#]&/@x@d;c=First/@d;f=u=={5};S="Straight";c==r[b=d[[1,1]],b+4],If[f,If[c==10~r~14,"Royal Flush",S<>" flush"],S],If[f,"Flush",Switch[t,{_,4},"Four of a kind",{2,3},"Full house",{__,3},"Three of a kind",{_,2,2},"Two pair",{__,2},"One pair",_,"High card"]]]&

Güzel. Desen eşleştirmesinde tasarruf edebileceğiniz bir yer bile buldunuz. Örneğin, _yerine{_,_,_,_}
DavidC

İkiniz de güzel çözümler. Karakter sayımı uğruna, "Çift" in "Bir Çift" olarak adlandırılması gerektiğini düşünüyorum, kulağa biraz kötü gelse de, yayınladığım ve diğerlerinin uyguladığı şey.
daniero

@Daniero Teşekkürler. Adı düzelteceğim.
Bay Wizard

3

K, 294 295

d:{F:"Flush";S:"Straight ";P:" Pair";K:" of a kind";$[(f:1=#?,/-1#'c)&("AJKQT")~a@<a:,/j:1#'c:" "\:x;"Royal ",F;f&s:(4#1)~1_-':a@<a:,/(("A23456789TJQKA")!1+!14)@j;S,F;4=p:|/#:'=j;"Four",K;(2;3)~u:a@<a:,/#:'=j;"Full House";f;F;s;S;3=p;"Three",K;(1;2;2)~u;"Two",P;(1;1;1;2)~u;"One",P;"High Card"]}

.

k)d'("TS JS QS KS AS";"3S 4S 5S 7S 6S";"JC JH KS JD JS";"JC JH 2S JD 2C";"2C 9C TC QC 6C";"8C 5D 9H 6C 7D";"8C 8D 9H 8S 7D";"8C 8D 9H 2S 9D";"8C 8D 4H 2S 9D";"3C 8D 4H 2S 9D")
"Royal Flush"
"Straight Flush"
"Four of a kind"
"Full House"
"Flush"
"Straight "
"Three of a kind"
"Two Pair"
"One Pair"
"High Card"

edit: Ace-low straights için 1 karakter eklendi


3

Python 334 , 326 322 Karakterler

p,f,l,t,o=" pair"," of a kind"," Flush","Straight","A23456789TJQK"
v,u=zip(*raw_input().split())
s=''.join(sorted(v,key=o.find))
print{5:"High card",7:"One"+p,9:"Two"+p,11:"Three"+f,13:"Full house",17:"Four"+f,23:t,24:l[1:],25:t,42:t+l,44:"Royal"+l}[(sum(map(v.count,v)),24)[len(set(u))<2]+((0,20)[s=="ATJQK"],18)[s in o]]

Son bir linerin oldukça okunaksız hale geldiğini biliyorum, çözümümle mutlu olduğumda golf oynamayan bir versiyon hazırlayacağım.


2

GolfScript, 258 250 karakter

3/zip~;.&,(!\{"23456789TJQKA"?}%$.(\{.@- 8%}%\;"\1"-!\.1/.&{1$\-,}%1.$?)"Four"" of a kind":k+{.,2="Full house"{.2\?)"Three"k+{.3-,({.3\?)"One pair"{;"Straight":?;2$2$&{(8="Royal"?if" flush"+}{;?{"Flush""High card"if}if}if}if}"Two pair"if}if}if}if])\;

Program yukarıda belirtildiği gibi STDIN'e giriş bekler ve STDOUT'a çıkar. Kodu kendiniz test edebilirsiniz .

> 8C 3H 8S 8H 3S
Full house

> 8C 7H 6S TH 9S
Straight

> AH 3H 4S 2H 6S
High card

Düzenleme: dahil w0lf'nin önerileri.


Güzel çözüm! " of a kind"Bir değişkeni koyarak 3 karakter kaydedebilirsiniz , çünkü iki kez kullanılır.
Cristian Lupascu

Aynı zamanda çalışır"Straight"
Cristian Lupascu 7:12

@ w0lf Teşekkürler. Önerilerinizi koda ekledim.
Howard,

Straights'ın tespitinde ince bir hata olduğunu düşünüyorum: Düz AH KH 2C 3H 4Holarak kabul edilir, ancak Yüksek kart olmalıdır.
Cristian Lupascu

@ w0lf Hmmm, bunun hakkında düşünmek zorundayım ...
Howard

2

Mathematica - 500 494 465 karakter

Bu çözüm Ed Pegg, Jr. tarafından yapılan bir poker gösterisine dayanmaktadır. Bu versiyonda, kartlar dahili olarak sayılar olarak ele alınır.Range[2,14]

v[x_] := Block[{d, t, c, f, s},
 d = Sort@ToExpression[Characters[ImportString[x, "Table"][[1]]] /. {"T" -> 10, "J" -> 11, "Q" -> 12, "K" -> 13, "A" -> 14}];t = Sort /@ Map[Length, Split /@ Sort /@ Transpose@d, {2}];c = d[[All, 1]];f = (t[[2]] == {5});s = c == Range[b = d[[1, 1]], b + 4];
If[s,
 If[f, If[c == 10~Range~14, "royal flush", "straight flush"],"straight"],
 If[ f, "flush",
Switch[t[[1]],
 {1, 4}, "four of a kind",
 {2, 3}, "full house",
 {1, 1, 3}, "three of a kind",
 {1, 2, 2}, "two pair",
 {1, 1, 1, 2}, "one pair",
 {1, 1, 1, 1, 1}, "high card"]]]]

Örnek girişler, çıkışlar:

veri

Notlar:

f: floş

c: kartlar (takım elbise olmadan)

s: düz

t: {kartlar, süitler}

D:


Güzel, ama iki çifti nasıl çıkarırsın JH 4C 2C JD TH?
daniero

Haklısın. Bazı bileşenleri bir araya getirdiğimde saf bir işleve girdiğimde ortaya çıkan bir hata var. Onu izleyeceğim.
DavidC,

@Dieiero Açtığınız konu ele alındı.
DavidC

David, bunu sıkıştırmak için çok yer var. İzin verirseniz?
Mr.Wizard

@ Mr.Wizard Misafirim olun. İzler ve öğrenirim.
DavidC
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.