ชื่อมือโป๊กเกอร์


22

ชื่อมือโป๊กเกอร์

ให้ไพ่ห้าใบส่งชื่อมือโป๊กเกอร์ซึ่งจะเป็นหนึ่งใน:

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

หากมีข้อสงสัยโปรดดูกฎที่http://en.wikipedia.org/wiki/List_of_poker_hands

อินพุต

ไพ่ 5 ใบจากอาร์กิวเมนต์ stdin หรือ commandline การ์ดเป็นสตริงตัวอักษรสองตัวบนแบบฟอร์มRSโดยที่ R คืออันดับและ S เป็นชุด การจัดอันดับคือ2- 9(ไพ่ตัวเลข), T(สิบ), J(แจ็ค), Q(ราชินี), K(ราชา), A(Ace) ชุดมีS, D, H, Cสำหรับจอบ, เพชร, หัวใจและคลับตามลำดับ

ตัวอย่างของการ์ด

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

ตัวอย่างอินพุต => เอาต์พุตที่ต้องการ

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

กฎระเบียบ

รหัสที่สั้นที่สุดชนะ

แก้ไข

ดูดีมาก! ฉันไม่สามารถตรวจสอบคำตอบทั้งหมดได้เพราะฉันไม่รู้ภาษาเหล่านี้เป็นอย่างดีและไม่มีคอมไพเลอร์ / ล่ามสำหรับพวกเขาทั้งหมด แต่ฉันสงสัยว่าไม่ใช่ทุกคนที่คิดว่าเอซนั้นสามารถเป็นทั้งสูงสุดและ บัตรต่ำสุดของตรง (ล้าง)


2
มีความเกี่ยวข้องกับรางoldie ในกองมากเกิน
dmckee

เราได้รับอนุญาตให้ใช้ประโยชน์จากชื่อมือ (หรือไม่) ตามที่เราต้องการหรือไม่?
Mr.Wizard

Mr.Wizard แน่นอน
daniero

คำตอบ:


3

GolfScript ( 209 208 207 206 200 199 197 196 ตัวอักษร)

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

ฉันใช้ประโยชน์จากอิสรภาพที่มีให้กับการปรับแต่งตัวพิมพ์ใหญ่: Straight Flush และ Royal Flush ของฉันทั้งคู่ใช้ประโยชน์ Flush เพื่อนำมาใช้ซ้ำคำจากฟลัชแบบง่าย

หมายเหตุ: บางรุ่นก่อนหน้านี้เป็นบั๊กกี้: พวกเขารองรับเฉพาะเฮ้าส์ฟูลเท่านั้นเมื่อทั้งคู่มีราคาต่ำกว่าทั้งคู่ พวกเขาสามารถแก้ไขได้โดยแทนที่ช่องว่างแยก- 0ด้วย$ด้วย

การสาธิต


ตอนนี้เป็นรายการที่เล่นกอล์ฟ! ฉันกำลังมองหาวิธีที่จะย่อให้สั้นลง แต่ไม่สามารถมากับอะไร การใช้.&การค้นหาตัวอักษรที่แตกต่างในสตริงเป็นกลอุบายที่มีประโยชน์มาก
Cristian Lupascu

@ w0lf นั่นเป็นกลลวงที่ค่อนข้างเป็นมาตรฐาน ฮาวเวิร์ดก็ใช้มันในโซลูชันของเขาเช่นกัน
Peter Taylor

8

มาด้วยคำตอบของฉันเอง :)

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]

สร้างรายการ 2x2 โดยที่ดัชนีของสองมิติคือบูลีนตรวจสอบการล้างข้อมูลและตรง ในกรณีของทั้งสองเราตรวจสอบว่ามันเป็นรอยัลฟลัชหรือเพียงแค่ฟลัชตรง สำหรับการไม่ฟลัชและไม่ตรงเราตรวจสอบมืออื่น ๆ :mและnถือไพ่ระดับเดียวกันและสูงสุดเป็นอันดับสอง mชื่อของมือจะถูกเก็บไว้ในรายการที่มีดัชนีตาม การตรวจสอบย่อยภายในค่าของรายการนี้เสร็จสิ้นด้วยnการแยกหนึ่งคู่จากสองคู่และสามชนิดจากบ้าน

แก้ไข: ขอบคุณ Nolen Royality ที่บันทึกไว้ทั้งหมด 20 ตัวอักษร!


1
... และเอาชนะฉัน
Mr.Wizard

ชอบวิธีการแก้ปัญหาใหม่ 312 ตัวอักษรมีขนาดเล็กมาก วิธีการที่ฉลาดมากในการจัดการกับหนึ่งคู่กับสองคู่: D
Nolen Royalty

ขอบคุณ :) คุณสามารถลองใช้ได้ถ้าคุณต้องการ แต่คุณอาจจะไม่ได้ใช้ตัวแปรที่คล้ายกันใด ๆ กับ Mine m และ n ตรวจสอบสิ่งนี้และดูรหัสของคุณอีกครั้งฉันเพิ่งรู้ว่าฉันสามารถลบบางอย่างในต้นฉบับดั้งเดิม ^^
daniero

1
คุณไม่สูญเสียอีก 8 ตัวอักษรโดยเปลี่ยนm,n=g([c.count(x)for x in set(r)])เป็นm,n=g(map(c.count,set(r)))ใช่หรือไม่
Nolen Royalty

ว้าวเจ้าถูกแล้วฉันทำได้: D ไม่รู้ทำไมมันทำให้ข้าใจ เยี่ยมมากขอบคุณ!
daniero

5

ทับทิม 1.9 (427 359 348 338 296 292)

แก้ไข : แก้ไขการทำงานกับเอซต่ำ

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]

แนวคิดพื้นฐานคือการสร้างอาเรย์ของปริมาณของการ์ดในแต่ละอันดับเรียงต่อกันเป็นตัวเลขลงในสตริงแล้วเรียกใช้นิพจน์ทั่วไปเพื่อดูว่ามือรูปร่างใดที่เหมาะสม เรานับจำนวนชุดที่แตกต่างเพื่อพิจารณาว่าจะตรวจสอบกับฟลัชที่แตกต่างกัน (เปี่ยมฟลัชฟลัชฟลัชรอยัลฟรัช) หรือไปที่รูปร่างอื่น ๆ (ทุกอย่างอื่น)

นำไพ่เป็นบรรทัดคำสั่งแยกกันอย่างเช่น:

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

4

C, 454 ตัวอักษร

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

เรียกใช้จากบรรทัดคำสั่งที่มีการ์ดเป็นอาร์กิวเมนต์เช่น. / a.out 8C 3H 8S 8H 3S

เวอร์ชันขยายพร้อมความคิดเห็น:

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

การแก้ไข:

  1. บันทึก 12 ตัวอักษรโดยรวมและนำลูปมาใช้ซ้ำ
  2. บันทึก 9 ตัวอักษรโดยกำหนดค่าคงที่ของสตริง
  3. บันทึก 19 ตัวอักษรโดยใช้การทำให้เป็นสตริงในมาโครน่ารังเกียจ ..

3

Mathematica , 365

นี่คือคำตอบของ David Carraher ของฉัน

แสดงด้วยพื้นที่สีขาวเพื่อให้อ่านง่ายขึ้น

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

รุ่นหนึ่งบรรทัด:

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

ดี คุณยังพบพื้นที่ที่จะบันทึกในการจับคู่รูปแบบ เช่น_แทน{_,_,_,_}
DavidC

คำตอบที่ดีคุณทั้งคู่ เพื่อประโยชน์ในการนับตัวละครฉันคิดว่า "Pair" ควรมีชื่อว่า "One Pair" แม้ว่ามันจะฟังดูไม่ดีนักเนื่องจากนั่นเป็นสิ่งที่ฉันโพสต์และคนอื่น ๆ ได้นำไปใช้
daniero

@Daniero ขอบคุณ ฉันจะแก้ไขชื่อ
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"

แก้ไข: เพิ่ม 1 อักขระสำหรับช่องว่าง Ace-low


3

Python 334 , 326 322 ตัวละคร

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

ฉันรู้ว่าหนึ่งสายการบินจะไม่สามารถอ่านได้สวยฉันจะวางรุ่นที่ไม่ใช่กอล์ฟเมื่อฉันมีความสุขกับการแก้ปัญหาของฉัน


2

GolfScript, 258 250 ตัวอักษร

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

โปรแกรมคาดว่าจะป้อนข้อมูลใน STDIN ตามที่ระบุด้านบนและส่งออกไปยัง STDOUT คุณอาจทดสอบด้วยตัวเองรหัส

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

> 8C 7H 6S TH 9S
Straight

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

แก้ไข:ข้อเสนอแนะของ Incorporated w0lf


ทางออกที่ดี! คุณสามารถบันทึก 3 ตัวอักษรโดยการใส่" of a kind"ตัวแปรเพราะมันใช้สองครั้ง
Cristian Lupascu

มันทำงานร่วมกับ"Straight"
Cristian Lupascu

@ w0lf ขอบคุณ ฉันเพิ่มข้อเสนอแนะของคุณไปยังรหัส
Howard

ฉันคิดว่ามีข้อบกพร่องเล็กน้อยในการตรวจจับ Straights: AH KH 2C 3H 4Hถือว่าเป็นแบบตรง แต่ควรเป็นการ์ดระดับสูง
Cristian Lupascu

@ w0lf อืมมผมต้องคิดเกี่ยวกับที่หนึ่ง ...
ฮาวเวิร์ด

2

Mathematica - 500 494 465 ตัวอักษร

วิธีการแก้ปัญหานี้ขึ้นอยู่กับการสาธิตโปกเกอร์โดย Ed Pegg จูเนียร์ในรุ่นนี้การ์ดจะได้รับการปฏิบัติภายในเป็นตัวเลข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"]]]]

ตัวอย่างอินพุต, เอาต์พุต:

ข้อมูล

หมายเหตุ:

f: เปี่ยม

c: ไพ่ (ไม่รวมสูท)

s: ตรง

t: {cards, suites}

d:


ดีมาก แต่คุณจะเอาสองคู่ออกมาได้JH 4C 2C JD THอย่างไร
daniero

คุณถูก. มีข้อผิดพลาดเกิดขึ้นเมื่อฉันรวมส่วนประกอบบางอย่างเข้าด้วยกันเป็นฟังก์ชั่นแท้ ฉันจะติดตามมัน
DavidC

@Daniero ปัญหาที่คุณยกได้รับการแก้ไข
DavidC

เดวิดมีห้องมากมายที่จะบีบอัดสิ่งนี้ ฉันขอ?
Mr.Wizard

@ Mr.Wizard เป็นแขกของฉัน ฉันจะดูและเรียนรู้
DavidC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.