Назвіть руку покеру


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 або командного рядка. Картка - це два букви на формі RS, де R - ранг, а S - масть. В рядах є 2- 9(номер картки), T(десять), J(Jack), Q(Queen), 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
Існує розпливчато пов'язаний старий на Stack Overflow .
dmckee

Чи дозволено нам використовувати великі літери (чи ні) назви рук, як нам заманеться?
Mr.Wizard

Містер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 обидва мають великі літери, щоб повторно використовувати слово з простого флешу.

Примітка: деякі більш ранні версії були баггі: вони підтримували повний будинок лише тоді, коли пара мала менше значення, ніж пара королівська. Їх можна виправити, замінивши простір, що розділяє, - 0на a $.

Демо


Тепер це програма для гольфу! Я шукав способи його скоротити, але нічого не можу придумати. Використання .&для пошуку різних символів у рядку - дуже корисний трюк.
Крістіан Лупаску

@ w0lf, це досить стандартний трюк. Говард теж використовує це у своєму рішенні.
Пітер Тейлор

8

Придумав власну відповідь :)

Пітон - 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метою відокремлення однієї пари від двох пар, а трьох - від будинку.

Редагувати: Дякую Нолен Рояліті за загальну кількість збережених 20 символів!


1
... і побили мою.
Mr.Wizard

Любіть нове рішення, 312 символів досить крихітні. Дуже розумний метод поводження з однією та двома парами: D
Нолен Роялті

Дякую :) Ви можете спробувати, якщо хочете. Але ви, можливо, не використовуєте жодної подібної змінної, як мої m та n. Перевіривши це і переглянувши ваш код ще раз, я зрозумів, що можу
збрити

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)

EDIT : Виправлено для роботи з низькими тузами.

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

Математика , 365

Ось моя відповідь на відповідь Девіда Каррахера.

Показаний з білим простором для деякої читабельності.

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

Гарні рішення, ви обоє. Заради кількості персонажів, я думаю, що «Пара» має бути названа «Одна пара», хоча це звучить трохи погано, оскільки саме це я написав та інші реалізували.
daniero

@Daniero Дякую Я виправлю ім’я.
Mr.Wizard

3

К, 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 знак для прямих тузів


3

Пітон 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

Редагувати: включені пропозиції w0lf.


Приємне рішення! Ви можете зберегти 3 символи, ввівши " of a kind"змінну, оскільки вона використовується двічі.
Крістіан Лупаску

також працює з"Straight"
Крістіан Лупаску

@ w0lf Дякую Я додав ваші пропозиції до коду.
Говард

Думаю, є непомітна помилка з виявленням Straights: AH KH 2C 3H 4Hвважається прямою, але має бути High card.
Крістіан Лупаску

@ w0lf Хм, я мушу подумати над цим ...
Говард

2

Математика - 500 494 465 символів

Це рішення засноване на демонстрації покеру Едом Пеггом-молодшим. У цій версії карти розглядаються внутрішньо як цифри в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: {карти, набори}

d:


Приємно, але як у вас вийти дві пари JH 4C 2C JD TH?
daniero

Ви праві. Виникла помилка, яка виникла, коли я об'єднав деякі компоненти разом у чисту функцію. Я відстежу це.
DavidC

@Daniero Вище вирішено питання, яке ви порушили.
DavidC

Девіде, є багато місця для цього. Чи можу я?
Mr.Wizard

@ Mr.Wizard Будьте моїм гостем. Я буду дивитись і навчатись.
DavidC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.