Đặt tên cho tay bài xì phé


22

Đặt tên cho tay bài xì phé

Cho năm lá bài, xuất ra tên bài xì phé, đây sẽ là một trong những:

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

Nếu nghi ngờ, hãy tham khảo các quy tắc tại http://en.wikipedia.org/wiki/List_of_poker_hands .

Đầu vào

5 thẻ từ đối số stdin hoặc dòng lệnh. Thẻ là một chuỗi hai chữ cái trên biểu mẫu RS, trong đó R là xếp hạng và S là phù hợp. Các cấp bậc2- 9(thẻ số), T(mười), J(Jack), Q(Nữ hoàng), K(Vua), A(Ace). Các bộ quần áoS, D, H, Ccho Spades, kim cương, trái tim và các câu lạc bộ tương ứng.

Ví dụ về thẻ

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

Ví dụ về đầu vào => đầu ra mong muốn

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

Quy tắc

Mã ngắn nhất sẽ thắng

Chỉnh sửa

Nhìn tuyệt vời cho đến nay! Tôi thực sự không thể xác minh tất cả các câu trả lời, vì tôi không biết rõ các ngôn ngữ này và không có trình biên dịch / phiên dịch cho tất cả chúng, nhưng tôi nghi ngờ rằng không phải ai cũng nghĩ rằng Aces có thể là cao nhất và các thẻ thấp nhất của một Straight (tuôn ra) .


2
Có một oldie mơ hồ liên quan đến Stack Overflow .
dmckee

Chúng tôi có được phép viết hoa (hoặc không) tên tay theo ý muốn không?
Mr.Wizard

Mr.Wizard, chắc chắn.
daniero

Câu trả lời:


3

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

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$+](=

Tôi đang khai thác quyền tự do được đề nghị để điều chỉnh cách viết hoa: Straight Flush và Royal Flush của tôi đều viết hoa Flush để sử dụng lại từ này từ đơn giản.

Lưu ý: một số phiên bản trước đó có lỗi: chúng chỉ hỗ trợ toàn bộ nhà khi cặp có giá trị thấp hơn so với cặp hoàng gia. Chúng có thể được sửa bằng cách thay thế khoảng cách - 0bằng a $.

Bản giới thiệu


Bây giờ đó là một chương trình chơi gôn! Tôi đã tìm mọi cách để rút ngắn nó, nhưng không thể đưa ra bất cứ điều gì. Sử dụng .&để tìm các ký tự riêng biệt trong một chuỗi là một mẹo rất hữu ích.
Cristian Lupascu

@ w0lf, đó là một mẹo khá chuẩn. Howard cũng sử dụng nó trong giải pháp của mình.
Peter Taylor

8

Đến với câu trả lời của riêng tôi :)

Con trăn - 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]

Tạo một danh sách 2x2 trong đó các chỉ số của hai chiều là kiểm tra boolean cho tuôn ra và thẳng. Trong trường hợp của cả hai, chúng tôi kiểm tra xem đó là một tuôn ra hoàng gia hay chỉ là một tuôn thẳng. Để không tuôn ra và không thẳng, chúng tôi kiểm tra các tay khác: mngiữ số lượng thẻ cùng cấp cao nhất và cao thứ hai; tên của các bàn tay được lưu trữ trong một danh sách với các chỉ số theo m. Kiểm tra phụ trong các giá trị của danh sách này được thực hiện nđể tách riêng một cặp từ hai cặp và ba loại từ nhà.

Chỉnh sửa: Cảm ơn Nolen Royality vì đã lưu tổng cộng 20 ký tự!


1
... và đánh bại tôi.
Mr.Wizard

Yêu giải pháp mới, 312 ký tự là khá nhỏ. Phương pháp rất thông minh để đối phó với một vs hai cặp: D
Nolen Royalty

Cảm ơn :) Bạn có thể thử nó nếu bạn muốn. Nhưng bạn có thể không sử dụng bất kỳ biến tương tự như của tôi m và n. Kiểm tra điều này và xem lại mã của bạn, tôi mới nhận ra mình có thể cạo thêm một số thứ nữa trên bản gốc ^^
daniero

1
Bạn không thể mất thêm 8 ký tự bằng cách chuyển m,n=g([c.count(x)for x in set(r)])sang m,n=g(map(c.count,set(r)))?
Nolen Royalty

Ái chà, bạn đúng là tôi có thể: D Không biết tại sao điều đó lại trượt tâm trí tôi. Bắt tốt, cảm ơn!
daniero

5

Ruby 1.9 (427 359 348 339 296 292)

EDIT : Đã sửa để làm việc với con át chủ bài thấp.

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]

Ý tưởng cơ bản là xây dựng một mảng số lượng thẻ trong mỗi cấp bậc, ghép các chữ số thành một chuỗi, sau đó chạy các biểu thức chính quy để xem hình dạng bàn tay nào phù hợp. Chúng tôi đếm số lượng bộ quần áo riêng biệt để xác định xem có nên kiểm tra nó với các lần xả khác nhau (xả, xả thẳng, xả hoàng gia) hoặc với các hình dạng khác (mọi thứ khác).

Lấy các thẻ làm đối số dòng lệnh riêng biệt, như vậy:

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

4

C, 454 ký tự

#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);}

Chạy từ dòng lệnh với các thẻ làm đối số, ví dụ ./a.out 8C 3H 8S 8H 3S

Phiên bản mở rộng, có ý kiến:

#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);    
}

Chỉnh sửa:

  1. Lưu 12 ký tự bằng cách kết hợp và tái sử dụng các vòng lặp.
  2. Đã lưu 9 ký tự bằng cách liên tục chuỗi nội tuyến.
  3. Đã lưu 19 ký tự bằng cách sử dụng chuỗi trong macro, khó chịu ..

3

Toán học , 365

Đây là nhận định của tôi về câu trả lời của David Carraher.

Hiển thị với khoảng trắng cho một số dễ đọc.

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"]
  ]
] &

Phiên bản một dòng:

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"]]]&

Tốt đẹp. Bạn thậm chí tìm thấy không gian để lưu trong mẫu phù hợp. Ví dụ _thay vì{_,_,_,_}
DavidC

Giải pháp tốt đẹp, cả hai bạn. Vì mục đích đếm số ký tự, tôi nghĩ "Cặp" nên được đặt tên là "Một cặp", mặc dù nghe có vẻ hơi tệ, vì đó là những gì tôi đã đăng và những người khác đã thực hiện.
daniero

@Daniero Cảm ơn. Tôi sẽ sửa tên.
Mr.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"

chỉnh sửa: Đã thêm 1 char cho sức mạnh Ace-low


3

Python 334 , 326 322 Ký tự

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

Tôi biết rằng một lớp lót cuối cùng đang trở nên khá khó đọc, tôi sẽ đưa ra một phiên bản không chơi gôn khi tôi hài lòng với giải pháp của mình.


2

GolfScript, 258 250 ký tự

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

Chương trình mong đợi đầu vào trên STDIN như đã nêu ở trên và đầu ra cho STDOUT. Bạn có thể tự kiểm tra mã .

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

> 8C 7H 6S TH 9S
Straight

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

Chỉnh sửa: Kết hợp các đề xuất của w0lf.


Giải pháp tốt đẹp! Bạn có thể lưu 3 ký tự bằng cách đặt " of a kind"một biến, vì nó được sử dụng hai lần.
Cristian Lupascu

nó cũng hoạt động với"Straight"
Cristian Lupascu

@ w0lf Cảm ơn bạn. Tôi đã thêm đề xuất của bạn vào mã.
Howard

Tôi nghĩ rằng có một lỗi tinh vi với việc phát hiện ra Straights: AH KH 2C 3H 4Hđược coi là Straight, nhưng nên là High card.
Cristian Lupascu

@ w0lf Hmmm, tôi phải suy nghĩ về điều đó ...
Howard

2

Toán học - 500 494 465 ký tự

Giải pháp này dựa trên một cuộc biểu tình poker của Ed Pegg, Jr. Trong phiên bản này, các thẻ được xử lý nội bộ dưới dạng số trongRange[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"]]]]

Mẫu đầu vào, đầu ra:

dữ liệu

Ghi chú:

f: tuôn ra

c: thẻ (không có bộ đồ)

s: thẳng

t: {thẻ, bộ}

d:


Đẹp, nhưng làm thế nào để bạn có được hai cặp ra JH 4C 2C JD TH?
daniero

Bạn nói đúng. Có một lỗi phát sinh khi tôi nối một số thành phần lại với nhau thành một hàm thuần túy. Tôi sẽ theo dõi nó xuống.
DavidC

@Daniero Vấn đề bạn nêu ra đã được giải quyết.
DavidC

David, có rất nhiều phòng để nén điều này. Tôi có thể
Mr.Wizard

@ Mr.Wizard Hãy là khách của tôi. Tôi sẽ xem và học hỏi.
DavidC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.